00001
00002
00003
00004 #ifndef IBIS_ROSTER_H
00005 #define IBIS_ROSTER_H
00006 #include "array_t.h"
00007 #include "util.h"
00010
00019 class ibis::roster {
00020 public:
00021 ~roster() {clear();};
00022 roster(const ibis::column* c, const char* dir = 0);
00023 roster(const ibis::column* c, ibis::fileManager::storage* st,
00024 uint32_t offset = 8);
00025
00026
00027
00028 const char* name() const {return "roster list";}
00029 const ibis::column* getColumn() const {return col;}
00030 uint32_t size() const;
00031
00032 int read(const char* idxfile);
00033 int read(ibis::fileManager::storage* st);
00034
00036 void print(std::ostream& out) const;
00038 int write(const char* dt) const;
00040 int writeSorted(const char* dt) const;
00041
00042 const array_t<uint32_t>& array() const {return ind;}
00043 inline uint32_t operator[](uint32_t i) const;
00044
00050 template <typename T>
00051 int locate(const ibis::array_t<T>& vals,
00052 ibis::bitvector& positions) const;
00055 template <typename T>
00056 int locate(const ibis::array_t<T>& vals,
00057 std::vector<uint32_t>& positions) const;
00058
00064 template <typename T>
00065 int locate(const std::vector<T>& vals,
00066 ibis::bitvector& positions) const;
00069 template <typename T>
00070 int locate(const std::vector<T>& vals,
00071 std::vector<uint32_t>& positions) const;
00072
00075 template <class T>
00076 static long mergeBlock2(const char *dsrc, const char *dout,
00077 const uint32_t segment, array_t<T>& buf1,
00078 array_t<T>& buf2, array_t<T>& buf3);
00079
00080
00081
00082
00083
00084
00085
00086 protected:
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 uint32_t locate(const double& val) const;
00100
00101 template <typename T> int
00102 icSearch(const std::vector<T>& vals, std::vector<uint32_t>& pos) const;
00103 template <typename T> int
00104 oocSearch(const std::vector<T>& vals, std::vector<uint32_t>& pos) const;
00105 template <typename inT, typename myT> int
00106 locate2(const std::vector<inT>&, std::vector<uint32_t>&) const;
00107 template <typename T> int
00108 icSearch(const ibis::array_t<T>& vals, std::vector<uint32_t>& pos) const;
00109 template <typename T> int
00110 oocSearch(const ibis::array_t<T>& vals, std::vector<uint32_t>& pos) const;
00111 template <typename inT, typename myT> int
00112 locate2(const ibis::array_t<inT>&, std::vector<uint32_t>&) const;
00113
00114 private:
00115
00116 const ibis::column* col;
00117 array_t<uint32_t> ind;
00118 mutable int inddes;
00119
00120
00121 void clear() {ind.clear(); if (inddes>=0) UnixClose(inddes);};
00122 int write(FILE* fptr) const;
00123
00125 void icSort(const char* f = 0);
00127 void oocSort(const char* f = 0);
00128 template <class T>
00129 long oocSortBlocks(const char *src, const char *dest,
00130 const char *ind, const uint32_t mblock,
00131 array_t<T>& dbuf1, array_t<T>& dbuf2,
00132 array_t<uint32_t>& ibuf) const;
00133 template <class T>
00134 long oocMergeBlocks(const char *dsrc, const char *dout,
00135 const char *isrc, const char *iout,
00136 const uint32_t mblock, const uint32_t stride,
00137 array_t<T>& dbuf1, array_t<T>& dbuf2,
00138 array_t<uint32_t>& ibuf1,
00139 array_t<uint32_t>& ibuf2) const;
00140
00141 roster();
00142 roster(const roster&);
00143 const roster& operator=(const roster&);
00144 };
00145
00146 namespace ibis {
00147 template <> int
00148 roster::locate(const std::vector<double>&, ibis::bitvector&) const;
00149 template <> int
00150 roster::locate(const ibis::array_t<double>&, ibis::bitvector&) const;
00151 }
00152
00154 inline uint32_t ibis::roster::operator[](uint32_t i) const {
00155 uint32_t tmp = UINT_MAX;
00156 if (i < ind.size()) {
00157 tmp = ind[i];
00158 }
00159 else if (inddes >= 0) {
00160 (void) UnixSeek(inddes, i*sizeof(uint32_t), SEEK_SET);
00161 (void) UnixRead(inddes, &tmp, sizeof(uint32_t));
00162 }
00163 else {
00164 LOGGER(ibis::gVerbose > 0)
00165 << "Warning -- roster(ind[" << ind.size() << "], inddes="
00166 << inddes << ")::operator[]: index i (" << i
00167 << ") is out of range";
00168 }
00169 return tmp;
00170 }
00171 #endif // IBIS_ROSTER_H
00172