43 #ifdef MEM_OPT_VERSION 44 static_assert (
sizeof(off_t) >=
sizeof(uint64_t),
"off_t less than 64bits not supported in MEM_OPT_VERSION");
49 std::ifstream fileStream;
50 unsigned int numElements;
51 unsigned short version;
54 IndexFile(std::string _filename): filename(_filename){
58 NAMD_die(
"error in IndexFile::IndexFile");
62 unsigned int size(){
return numElements;}
66 std::vector<unsigned int> index;
67 index.resize(numElements);
68 fileStream.read(reinterpret_cast<char*>(&index[0]), index.size()*
sizeof(
unsigned int));
72 std::for_each(index.begin(), index.end(), [] (
unsigned int &n) { n = ntohl(n);});
76 NAMD_die(
"error in IndexFile::getAllElements");
79 void seek(off_t pos) {fileStream.seekg(pos);}
81 std::vector<unsigned int>
getNElements(off_t offset,
size_t numElementsRange)
83 std::vector<unsigned int> index;
84 index.resize(numElementsRange);
86 fileStream.read(reinterpret_cast<char*>(&index[0]), index.size()*
sizeof(
unsigned int));
88 std::for_each(index.begin(), index.end(), [] (
unsigned int &n) { n = ntohl(n);});
92 NAMD_die(
"error in IndexFile::getNElements");
106 fileStream.open(filename.c_str(), std::ios::in | std::ifstream::binary);
108 fileStream.read(reinterpret_cast<char*>(&version),
sizeof(
unsigned short int));
109 fileStream.seekg(0, fileStream.end);
110 unsigned int lengthCheck = fileStream.tellg();
111 unsigned int countedLength =0;
112 fileStream.seekg(0, fileStream.beg);
113 unsigned short beVersion=ntohs(version);
116 if(ntohs(version)==1)
118 networkEndian =
true;
125 numElements = lengthCheck/
sizeof(
unsigned int);
128 fileStream.seekg(2, fileStream.beg);
129 fileStream.read(reinterpret_cast<char*>(&numElements),
sizeof(
unsigned int));
130 numElements = (networkEndian) ? ntohl(numElements) : numElements;
131 countedLength = (lengthCheck-
sizeof(char)-
sizeof(
unsigned int))/
sizeof(
unsigned int);
132 if(numElements!= countedLength)
134 std::string e=
"error in IndexFile::open mismatch in element count";
135 e+=
" file reports "+std::to_string(numElements)+
" counted "+std::to_string(countedLength);
140 NAMD_die(
"error in IndexFile::open unsupported version");
143 return(fileStream.is_open());
std::vector< unsigned int > getNElements(off_t offset, size_t numElementsRange)
std::vector< unsigned int > getElements()
unsigned int getNumElements()
void NAMD_die(const char *err_msg)
std::vector< unsigned int > getNElements(size_t numElements)
IndexFile(std::string _filename)
std::vector< unsigned int > getAllElements()