00001
00002
00003
00004 #ifndef IBIS_COLVALUES_H
00005 #define IBIS_COLVALUES_H
00006 #include "column.h"
00007 #include "utilidor.h"
00008
00011
00014 class FASTBIT_CXX_DLLSPEC ibis::colValues {
00015 public:
00016 virtual ~colValues() {}
00017
00019 static colValues* create(const ibis::column* c,
00020 const ibis::bitvector& hits);
00022 static colValues* create(const ibis::column* c,
00023 ibis::fileManager::storage* store,
00024 const uint32_t start, const uint32_t end);
00026 static colValues* create(const ibis::column* c);
00027
00029 virtual const ibis::column* operator->() const {return col;};
00030 virtual bool empty() const = 0;
00031 virtual void reduce(const array_t<uint32_t>& starts) = 0;
00032 virtual void reduce(const array_t<uint32_t>& starts,
00033 ibis::selectClause::AGREGADO func) = 0;
00034 virtual void erase(uint32_t i, uint32_t j) = 0;
00035 virtual void swap(uint32_t i, uint32_t j) = 0;
00036 virtual uint32_t size() const = 0;
00037 virtual uint32_t elementSize() const = 0;
00039 virtual ibis::TYPE_T getType() const =0;
00041 virtual void* getArray() const =0;
00043 virtual void nosharing() =0;
00044
00045 bool canSort() const
00046 {return (col ? col->type() != ibis::TEXT : false);}
00047
00048 void swap(colValues& rhs) {
00049 const ibis::column* c = rhs.col;
00050 rhs.col = col;
00051 col = c;
00052 }
00053
00055 virtual uint32_t write(FILE* fptr) const = 0;
00057 virtual void write(std::ostream& out, uint32_t i) const = 0;
00058
00060 virtual void sort(uint32_t i, uint32_t j, bundle* bdl) = 0;
00063 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00064 colList::iterator head, colList::iterator tail) = 0;
00067 virtual void sort(uint32_t i, uint32_t j,
00068 array_t<uint32_t>& neworder) const = 0;
00071 virtual void reorder(const array_t<uint32_t>& ind) = 0;
00074 virtual array_t<uint32_t>*
00075 segment(const array_t<uint32_t>* old=0) const = 0;
00077 virtual long truncate(uint32_t keep) = 0;
00079 virtual long truncate(uint32_t keep, uint32_t start) = 0;
00081 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const = 0;
00083 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const = 0;
00084
00085 virtual double getMin() const = 0;
00086 virtual double getMax() const = 0;
00087 virtual double getSum() const = 0;
00088 virtual int32_t getInt(uint32_t) const = 0;
00089 virtual uint32_t getUInt(uint32_t) const = 0;
00090 virtual int64_t getLong(uint32_t) const = 0;
00091 virtual uint64_t getULong(uint32_t) const = 0;
00092 virtual float getFloat(uint32_t) const = 0;
00093 virtual double getDouble(uint32_t) const = 0;
00094
00095 protected:
00096 const ibis::column* col;
00097
00098 colValues() : col(0) {}
00099 colValues(const ibis::column* c) : col(c) {};
00100
00101 private:
00102 colValues& operator=(const colValues&);
00103 };
00104
00106 class FASTBIT_CXX_DLLSPEC ibis::colInts : public ibis::colValues {
00107 public:
00108 colInts() : colValues(), array(0) {};
00109 colInts(const ibis::column* c, const ibis::bitvector& hits)
00110 : colValues(c), array(c->selectInts(hits)) {}
00111 colInts(const ibis::column* c, ibis::fileManager::storage* store,
00112 const uint32_t start, const uint32_t nelm)
00113 : colValues(c), array(new array_t<int32_t>(store, start, nelm)) {}
00114 colInts(const ibis::column* c);
00115 virtual ~colInts() {delete array;}
00116
00117 virtual bool empty() const {return (col==0 || array==0);}
00118 virtual uint32_t size() const {return (array ? array->size() : 0);}
00119 virtual uint32_t elementSize() const {return sizeof(int);}
00120 virtual ibis::TYPE_T getType() const {return ibis::INT;}
00121 virtual void* getArray() const {return array;}
00122 virtual void nosharing() {array->nosharing();}
00123
00124 virtual void reduce(const array_t<uint32_t>& starts);
00125 virtual void reduce(const array_t<uint32_t>& starts,
00126 ibis::selectClause::AGREGADO func);
00127 virtual void erase(uint32_t i, uint32_t j) {
00128 array->erase(array->begin()+i, array->begin()+j);}
00129 virtual void swap(uint32_t i, uint32_t j) {
00130 int32_t tmp = (*array)[i];
00131 (*array)[i] = (*array)[j];
00132 (*array)[j] = tmp;}
00133
00134 void swap(colInts& rhs) {
00135 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00136 array_t<int32_t>* a = rhs.array; rhs.array = array; array = a;}
00137
00138
00139 virtual uint32_t write(FILE* fptr) const {
00140 if (array) {
00141 uint32_t nelm = array->size();
00142 return nelm - fwrite(array->begin(), sizeof(int), nelm, fptr);
00143 }
00144 else {
00145 return 0;
00146 }
00147 }
00148
00149 virtual void write(std::ostream& out, uint32_t i) const
00150 {out << (*array)[i];}
00151
00152 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00153 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00154 colList::iterator head, colList::iterator tail);
00155 virtual void sort(uint32_t i, uint32_t j,
00156 array_t<uint32_t>& neworder) const;
00157 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00158 virtual void reorder(const array_t<uint32_t>& ind)
00159 {ibis::util::reorder(*array, ind);}
00160 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00161 {array->topk(k, ind);}
00162 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00163 {array->bottomk(k, ind);}
00164 virtual long truncate(uint32_t keep);
00165 virtual long truncate(uint32_t keep, uint32_t start);
00166
00167 virtual double getMin() const;
00168 virtual double getMax() const;
00169 virtual double getSum() const;
00170 virtual int32_t getInt(uint32_t i) const {return (*array)[i];}
00171 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00172 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00173 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00174 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00175 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00176
00177 private:
00178 array_t<int32_t>* array;
00179
00180 colInts(const colInts&);
00181 colInts& operator=(const colInts&);
00182 };
00183
00185 class FASTBIT_CXX_DLLSPEC ibis::colUInts : public ibis::colValues {
00186 public:
00187 colUInts() : colValues(), array(0) {};
00188 colUInts(const ibis::column* c, const ibis::bitvector& hits)
00189 : colValues(c), array(c->selectUInts(hits)) {}
00190 colUInts(const ibis::column* c, ibis::fileManager::storage* store,
00191 const uint32_t start, const uint32_t nelm)
00192 : colValues(c), array(new array_t<uint32_t>(store, start, nelm)) {}
00193 colUInts(const ibis::column* c);
00194 virtual ~colUInts() {delete array;}
00195
00196 virtual bool empty() const {return (col==0 || array==0);}
00197 virtual uint32_t size() const {return (array ? array->size() : 0);}
00198 virtual uint32_t elementSize() const {return sizeof(unsigned);}
00199 virtual ibis::TYPE_T getType() const {return ibis::UINT;}
00200 virtual void* getArray() const {return array;}
00201 virtual void nosharing() {array->nosharing();}
00202
00203 virtual void erase(uint32_t i, uint32_t j) {
00204 array->erase(array->begin()+i, array->begin()+j);}
00205 virtual void swap(uint32_t i, uint32_t j) {
00206 uint32_t tmp = (*array)[i];
00207 (*array)[i] = (*array)[j];
00208 (*array)[j] = tmp;}
00209
00210 virtual void reduce(const array_t<uint32_t>& starts);
00211 virtual void reduce(const array_t<uint32_t>& starts,
00212 ibis::selectClause::AGREGADO func);
00213 void swap(colUInts& rhs) {
00214 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00215 array_t<uint32_t>* a = rhs.array; rhs.array = array; array = a;}
00216
00218 virtual uint32_t write(FILE* fptr) const {
00219 if (array) {
00220 uint32_t nelm = array->size();
00221 return nelm - fwrite(array->begin(), sizeof(unsigned), nelm, fptr);
00222 }
00223 else {
00224 return 0;
00225 }
00226 }
00228 virtual void write(std::ostream& out, uint32_t i) const {
00229 if (col->type() == ibis::CATEGORY || col->type() == ibis::TEXT) {
00230 std::string str;
00231 col->getString((*array)[i], str);
00232 if (str.empty()) {
00233 out << "<NULL>";
00234 }
00235 else {
00236 out << '"' << str << '"';
00237 }
00238 }
00239 else {
00240 out << (*array)[i];
00241 }
00242 }
00243
00244 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00245 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00246 colList::iterator head, colList::iterator tail);
00247 virtual void sort(uint32_t i, uint32_t j,
00248 array_t<uint32_t>& neworder) const;
00249 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00250 virtual void reorder(const array_t<uint32_t>& ind)
00251 {ibis::util::reorder(*array, ind);}
00252 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00253 {array->topk(k, ind);}
00254 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00255 {array->bottomk(k, ind);}
00256 virtual long truncate(uint32_t keep);
00257 virtual long truncate(uint32_t keep, uint32_t start);
00258
00259 virtual double getMin() const;
00260 virtual double getMax() const;
00261 virtual double getSum() const;
00262 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00263 virtual uint32_t getUInt(uint32_t i) const {return (*array)[i];}
00264 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00265 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00266 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00267 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00268
00269 private:
00270 array_t<uint32_t>* array;
00271
00272 colUInts(const colUInts&);
00273 colUInts& operator=(const colUInts&);
00274 };
00275
00277 class FASTBIT_CXX_DLLSPEC ibis::colLongs : public ibis::colValues {
00278 public:
00279 colLongs() : colValues(), array(0) {};
00280 colLongs(const ibis::column* c, const ibis::bitvector& hits)
00281 : colValues(c), array(c->selectLongs(hits)) {}
00282 colLongs(const ibis::column* c, ibis::fileManager::storage* store,
00283 const uint32_t start, const uint32_t nelm)
00284 : colValues(c), array(new array_t<int64_t>(store, start, nelm)) {}
00285 colLongs(const ibis::column* c);
00286 virtual ~colLongs() {delete array;}
00287
00288 virtual bool empty() const {return (col==0 || array==0);}
00289 virtual uint32_t size() const {return (array ? array->size() : 0);}
00290 virtual uint32_t elementSize() const {return sizeof(int64_t);}
00291 virtual ibis::TYPE_T getType() const {return ibis::LONG;}
00292 virtual void* getArray() const {return array;}
00293 virtual void nosharing() {array->nosharing();}
00294
00295 virtual void reduce(const array_t<uint32_t>& starts);
00296 virtual void reduce(const array_t<uint32_t>& starts,
00297 ibis::selectClause::AGREGADO func);
00298 virtual void erase(uint32_t i, uint32_t j) {
00299 array->erase(array->begin()+i, array->begin()+j);}
00300 virtual void swap(uint32_t i, uint32_t j) {
00301 int64_t tmp = (*array)[i];
00302 (*array)[i] = (*array)[j];
00303 (*array)[j] = tmp;}
00304
00305 void swap(colLongs& rhs) {
00306 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00307 array_t<int64_t>* a = rhs.array; rhs.array = array; array = a;}
00308
00309
00310 virtual uint32_t write(FILE* fptr) const {
00311 if (array) {
00312 uint32_t nelm = array->size();
00313 return nelm - fwrite(array->begin(), sizeof(int64_t), nelm, fptr);
00314 }
00315 else {
00316 return 0;
00317 }
00318 }
00319
00320 virtual void write(std::ostream& out, uint32_t i) const
00321 {out << (*array)[i];}
00322
00323 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00324 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00325 colList::iterator head, colList::iterator tail);
00326 virtual void sort(uint32_t i, uint32_t j,
00327 array_t<uint32_t>& neworder) const;
00328 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00329 virtual void reorder(const array_t<uint32_t>& ind)
00330 {ibis::util::reorder(*array, ind);}
00331 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00332 {array->topk(k, ind);}
00333 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00334 {array->bottomk(k, ind);}
00335 virtual long truncate(uint32_t keep);
00336 virtual long truncate(uint32_t keep, uint32_t start);
00337
00338 virtual double getMin() const;
00339 virtual double getMax() const;
00340 virtual double getSum() const;
00341 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00342 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00343 virtual int64_t getLong(uint32_t i) const {return (*array)[i];}
00344 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00345 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00346 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00347
00348 private:
00349 array_t<int64_t>* array;
00350
00351 colLongs(const colLongs&);
00352 colLongs& operator=(const colLongs&);
00353 };
00354
00356 class FASTBIT_CXX_DLLSPEC ibis::colULongs : public ibis::colValues {
00357 public:
00358 colULongs() : colValues(), array(0) {};
00359 colULongs(const ibis::column* c, const ibis::bitvector& hits)
00360 : colValues(c), array(c->selectULongs(hits)) {}
00361 colULongs(const ibis::column* c, ibis::fileManager::storage* store,
00362 const uint32_t start, const uint32_t nelm)
00363 : colValues(c), array(new array_t<uint64_t>(store, start, nelm)) {}
00364 colULongs(const ibis::column* c);
00365 virtual ~colULongs() {delete array;}
00366
00367 virtual bool empty() const {return (col==0 || array==0);}
00368 virtual uint32_t size() const {return (array ? array->size() : 0);}
00369 virtual uint32_t elementSize() const {return sizeof(uint64_t);}
00370 virtual ibis::TYPE_T getType() const {return ibis::ULONG;}
00371 virtual void* getArray() const {return array;}
00372 virtual void nosharing() {array->nosharing();}
00373
00374 virtual void erase(uint32_t i, uint32_t j) {
00375 array->erase(array->begin()+i, array->begin()+j);}
00376 virtual void swap(uint32_t i, uint32_t j) {
00377 uint64_t tmp = (*array)[i];
00378 (*array)[i] = (*array)[j];
00379 (*array)[j] = tmp;}
00380
00381 virtual void reduce(const array_t<uint32_t>& starts);
00382 virtual void reduce(const array_t<uint32_t>& starts,
00383 ibis::selectClause::AGREGADO func);
00384 void swap(colULongs& rhs) {
00385 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00386 array_t<uint64_t>* a = rhs.array; rhs.array = array; array = a;}
00387
00389 virtual uint32_t write(FILE* fptr) const {
00390 if (array) {
00391 uint32_t nelm = array->size();
00392 return nelm - fwrite(array->begin(), sizeof(uint64_t), nelm, fptr);
00393 }
00394 else {
00395 return 0;
00396 }
00397 }
00399 virtual void write(std::ostream& out, uint32_t i) const {
00400 if (col->type() == ibis::CATEGORY || col->type() == ibis::TEXT) {
00401 std::string str;
00402 col->getString((*array)[i], str);
00403 if (str.empty()) {
00404 out << "<NULL>";
00405 }
00406 else {
00407 out << str;
00408 }
00409 }
00410 else {
00411 out << (*array)[i];
00412 }
00413 }
00414
00415 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00416 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00417 colList::iterator head, colList::iterator tail);
00418 virtual void sort(uint32_t i, uint32_t j,
00419 array_t<uint32_t>& neworder) const;
00420 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00421 virtual void reorder(const array_t<uint32_t>& ind)
00422 {ibis::util::reorder(*array, ind);}
00423 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00424 {array->topk(k, ind);}
00425 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00426 {array->bottomk(k, ind);}
00427 virtual long truncate(uint32_t keep);
00428 virtual long truncate(uint32_t keep, uint32_t start);
00429
00430 virtual double getMin() const;
00431 virtual double getMax() const;
00432 virtual double getSum() const;
00433 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00434 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00435 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00436 virtual uint64_t getULong(uint32_t i) const {return (*array)[i];}
00437 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00438 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00439
00440 private:
00441 array_t<uint64_t>* array;
00442
00443 colULongs(const colULongs&);
00444 colULongs& operator=(const colULongs&);
00445 };
00446
00448 class FASTBIT_CXX_DLLSPEC ibis::colShorts : public ibis::colValues {
00449 public:
00450 colShorts() : colValues(), array(0) {};
00451 colShorts(const ibis::column* c, const ibis::bitvector& hits)
00452 : colValues(c), array(c->selectShorts(hits)) {}
00453 colShorts(const ibis::column* c, ibis::fileManager::storage* store,
00454 const uint32_t start, const uint32_t nelm)
00455 : colValues(c), array(new array_t<int16_t>(store, start, nelm)) {}
00456 colShorts(const ibis::column* c);
00457 virtual ~colShorts() {delete array;}
00458
00459 virtual bool empty() const {return (col==0 || array==0);}
00460 virtual uint32_t size() const {return (array ? array->size() : 0);}
00461 virtual uint32_t elementSize() const {return sizeof(int16_t);}
00462 virtual ibis::TYPE_T getType() const {return ibis::SHORT;}
00463 virtual void* getArray() const {return array;}
00464 virtual void nosharing() {array->nosharing();}
00465
00466 virtual void reduce(const array_t<uint32_t>& starts);
00467 virtual void reduce(const array_t<uint32_t>& starts,
00468 ibis::selectClause::AGREGADO func);
00469 virtual void erase(uint32_t i, uint32_t j) {
00470 array->erase(array->begin()+i, array->begin()+j);}
00471 virtual void swap(uint32_t i, uint32_t j) {
00472 int16_t tmp = (*array)[i];
00473 (*array)[i] = (*array)[j];
00474 (*array)[j] = tmp;}
00475
00476 void swap(colShorts& rhs) {
00477 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00478 array_t<int16_t>* a = rhs.array; rhs.array = array; array = a;}
00479
00480
00481 virtual uint32_t write(FILE* fptr) const {
00482 if (array) {
00483 uint32_t nelm = array->size();
00484 return nelm - fwrite(array->begin(), sizeof(int16_t), nelm, fptr);
00485 }
00486 else {
00487 return 0;
00488 }
00489 }
00490
00491 virtual void write(std::ostream& out, uint32_t i) const
00492 {out << (*array)[i];}
00493
00494 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00495 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00496 colList::iterator head, colList::iterator tail);
00497 virtual void sort(uint32_t i, uint32_t j,
00498 array_t<uint32_t>& neworder) const;
00499 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00500 virtual void reorder(const array_t<uint32_t>& ind)
00501 {ibis::util::reorder(*array, ind);}
00502 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00503 {array->topk(k, ind);}
00504 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00505 {array->bottomk(k, ind);}
00506 virtual long truncate(uint32_t keep);
00507 virtual long truncate(uint32_t keep, uint32_t start);
00508
00509 virtual double getMin() const;
00510 virtual double getMax() const;
00511 virtual double getSum() const;
00512 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00513 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00514 virtual int64_t getLong(uint32_t i) const {return (*array)[i];}
00515 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00516 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00517 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00518
00519 private:
00520 array_t<int16_t>* array;
00521
00522 colShorts(const colShorts&);
00523 colShorts& operator=(const colShorts&);
00524 };
00525
00527 class FASTBIT_CXX_DLLSPEC ibis::colUShorts : public ibis::colValues {
00528 public:
00529 colUShorts() : colValues(), array(0) {};
00530 colUShorts(const ibis::column* c, const ibis::bitvector& hits)
00531 : colValues(c), array(c->selectUShorts(hits)) {}
00532 colUShorts(const ibis::column* c, ibis::fileManager::storage* store,
00533 const uint32_t start, const uint32_t nelm)
00534 : colValues(c), array(new array_t<uint16_t>(store, start, nelm)) {}
00535 colUShorts(const ibis::column* c);
00536 virtual ~colUShorts() {delete array;}
00537
00538 virtual bool empty() const {return (col==0 || array==0);}
00539 virtual uint32_t size() const {return (array ? array->size() : 0);}
00540 virtual uint32_t elementSize() const {return sizeof(uint16_t);}
00541 virtual ibis::TYPE_T getType() const {return ibis::USHORT;}
00542 virtual void* getArray() const {return array;}
00543 virtual void nosharing() {array->nosharing();}
00544
00545 virtual void erase(uint32_t i, uint32_t j) {
00546 array->erase(array->begin()+i, array->begin()+j);}
00547 virtual void swap(uint32_t i, uint32_t j) {
00548 uint16_t tmp = (*array)[i];
00549 (*array)[i] = (*array)[j];
00550 (*array)[j] = tmp;}
00551
00552 virtual void reduce(const array_t<uint32_t>& starts);
00553 virtual void reduce(const array_t<uint32_t>& starts,
00554 ibis::selectClause::AGREGADO func);
00555 void swap(colUShorts& rhs) {
00556 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00557 array_t<uint16_t>* a = rhs.array; rhs.array = array; array = a;}
00558
00560 virtual uint32_t write(FILE* fptr) const {
00561 if (array) {
00562 uint32_t nelm = array->size();
00563 return nelm - fwrite(array->begin(), sizeof(uint16_t), nelm, fptr);
00564 }
00565 else {
00566 return 0;
00567 }
00568 }
00570 virtual void write(std::ostream& out, uint32_t i) const {
00571 out << (*array)[i];
00572 }
00573
00574 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00575 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00576 colList::iterator head, colList::iterator tail);
00577 virtual void sort(uint32_t i, uint32_t j,
00578 array_t<uint32_t>& neworder) const;
00579 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00580 virtual void reorder(const array_t<uint32_t>& ind)
00581 {ibis::util::reorder(*array, ind);}
00582 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00583 {array->topk(k, ind);}
00584 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00585 {array->bottomk(k, ind);}
00586 virtual long truncate(uint32_t keep);
00587 virtual long truncate(uint32_t keep, uint32_t start);
00588
00589 virtual double getMin() const;
00590 virtual double getMax() const;
00591 virtual double getSum() const;
00592 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00593 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00594 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00595 virtual uint64_t getULong(uint32_t i) const {return (*array)[i];}
00596 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00597 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00598
00599 private:
00600 array_t<uint16_t>* array;
00601
00602 colUShorts(const colUShorts&);
00603 colUShorts& operator=(const colUShorts&);
00604 };
00605
00607 class FASTBIT_CXX_DLLSPEC ibis::colBytes : public ibis::colValues {
00608 public:
00609 colBytes() : colValues(), array(0) {};
00610 colBytes(const ibis::column* c, const ibis::bitvector& hits)
00611 : colValues(c), array(c->selectBytes(hits)) {}
00612 colBytes(const ibis::column* c, ibis::fileManager::storage* store,
00613 const uint32_t start, const uint32_t nelm)
00614 : colValues(c), array(new array_t<signed char>(store, start, nelm)) {}
00615 colBytes(const ibis::column* c);
00616 virtual ~colBytes() {delete array;}
00617
00618 virtual bool empty() const {return (col==0 || array==0);}
00619 virtual uint32_t size() const {return (array ? array->size() : 0);}
00620 virtual uint32_t elementSize() const {return sizeof(char);}
00621 virtual ibis::TYPE_T getType() const {return ibis::BYTE;}
00622 virtual void* getArray() const {return array;}
00623 virtual void nosharing() {array->nosharing();}
00624
00625 virtual void reduce(const array_t<uint32_t>& starts);
00626 virtual void reduce(const array_t<uint32_t>& starts,
00627 ibis::selectClause::AGREGADO func);
00628 virtual void erase(uint32_t i, uint32_t j) {
00629 array->erase(array->begin()+i, array->begin()+j);}
00630 virtual void swap(uint32_t i, uint32_t j) {
00631 signed char tmp = (*array)[i];
00632 (*array)[i] = (*array)[j];
00633 (*array)[j] = tmp;}
00634
00635 void swap(colBytes& rhs) {
00636 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00637 array_t<signed char>* a = rhs.array; rhs.array = array; array = a;}
00638
00639
00640 virtual uint32_t write(FILE* fptr) const {
00641 if (array) {
00642 uint32_t nelm = array->size();
00643 return nelm - fwrite(array->begin(), sizeof(char), nelm, fptr);
00644 }
00645 else {
00646 return 0;
00647 }
00648 }
00649
00650 virtual void write(std::ostream& out, uint32_t i) const
00651 {out << (int16_t)(*array)[i];}
00652
00653 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00654 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00655 colList::iterator head, colList::iterator tail);
00656 virtual void sort(uint32_t i, uint32_t j,
00657 array_t<uint32_t>& neworder) const;
00658 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00659 virtual void reorder(const array_t<uint32_t>& ind)
00660 {ibis::util::reorder(*array, ind);}
00661 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00662 {array->topk(k, ind);}
00663 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00664 {array->bottomk(k, ind);}
00665 virtual long truncate(uint32_t keep);
00666 virtual long truncate(uint32_t keep, uint32_t start);
00667
00668 virtual double getMin() const;
00669 virtual double getMax() const;
00670 virtual double getSum() const;
00671 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00672 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00673 virtual int64_t getLong(uint32_t i) const {return (*array)[i];}
00674 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00675 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00676 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00677
00678 private:
00679 array_t<signed char>* array;
00680
00681 colBytes(const colBytes&);
00682 colBytes& operator=(const colBytes&);
00683 };
00684
00686 class FASTBIT_CXX_DLLSPEC ibis::colUBytes : public ibis::colValues {
00687 public:
00688 colUBytes() : colValues(), array(0) {};
00689 colUBytes(const ibis::column* c, const ibis::bitvector& hits)
00690 : colValues(c), array(c->selectUBytes(hits)) {}
00691 colUBytes(const ibis::column* c, ibis::fileManager::storage* store,
00692 const uint32_t start, const uint32_t nelm)
00693 : colValues(c), array(new array_t<unsigned char>(store, start, nelm)) {}
00694 colUBytes(const ibis::column* c);
00695 virtual ~colUBytes() {delete array;}
00696
00697 virtual bool empty() const {return (col==0 || array==0);}
00698 virtual uint32_t size() const {return (array ? array->size() : 0);}
00699 virtual uint32_t elementSize() const {return sizeof(char);}
00700 virtual ibis::TYPE_T getType() const {return ibis::UBYTE;}
00701 virtual void* getArray() const {return array;}
00702 virtual void nosharing() {array->nosharing();}
00703
00704 virtual void erase(uint32_t i, uint32_t j) {
00705 array->erase(array->begin()+i, array->begin()+j);}
00706 virtual void swap(uint32_t i, uint32_t j) {
00707 unsigned char tmp = (*array)[i];
00708 (*array)[i] = (*array)[j];
00709 (*array)[j] = tmp;}
00710
00711 virtual void reduce(const array_t<uint32_t>& starts);
00712 virtual void reduce(const array_t<uint32_t>& starts,
00713 ibis::selectClause::AGREGADO func);
00714 void swap(colUBytes& rhs) {
00715 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00716 array_t<unsigned char>* a = rhs.array; rhs.array = array; array = a;}
00717
00719 virtual uint32_t write(FILE* fptr) const {
00720 if (array) {
00721 uint32_t nelm = array->size();
00722 return nelm - fwrite(array->begin(), sizeof(char), nelm, fptr);
00723 }
00724 else {
00725 return 0;
00726 }
00727 }
00729 virtual void write(std::ostream& out, uint32_t i) const {
00730 out << (uint16_t)(*array)[i];
00731 }
00732
00733 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00734 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00735 colList::iterator head, colList::iterator tail);
00736 virtual void sort(uint32_t i, uint32_t j,
00737 array_t<uint32_t>& neworder) const;
00738 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00739 virtual void reorder(const array_t<uint32_t>& ind)
00740 {ibis::util::reorder(*array, ind);}
00741 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00742 {array->topk(k, ind);}
00743 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00744 {array->bottomk(k, ind);}
00745 virtual long truncate(uint32_t keep);
00746 virtual long truncate(uint32_t keep, uint32_t start);
00747
00748 virtual double getMin() const;
00749 virtual double getMax() const;
00750 virtual double getSum() const;
00751 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00752 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00753 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00754 virtual uint64_t getULong(uint32_t i) const {return (*array)[i];}
00755 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00756 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00757
00758 private:
00759 array_t<unsigned char>* array;
00760
00761 colUBytes(const colUBytes&);
00762 colUBytes& operator=(const colUBytes&);
00763 };
00764
00766 class FASTBIT_CXX_DLLSPEC ibis::colFloats : public ibis::colValues {
00767 public:
00768 colFloats() : colValues(), array(0) {};
00769 colFloats(const ibis::column* c, const ibis::bitvector& hits)
00770 : colValues(c), array(c->selectFloats(hits)) {}
00771 colFloats(const ibis::column* c, ibis::fileManager::storage* store,
00772 const uint32_t start, const uint32_t nelm)
00773 : colValues(c), array(new array_t<float>(store, start, nelm)) {}
00774 colFloats(const ibis::column* c);
00775 virtual ~colFloats() {delete array;}
00776
00777 virtual bool empty() const {return (col==0 || array==0);}
00778 virtual uint32_t size() const {return (array ? array->size() : 0);}
00779 virtual uint32_t elementSize() const {return sizeof(float);}
00780 virtual ibis::TYPE_T getType() const {return ibis::FLOAT;}
00781 virtual void* getArray() const {return array;}
00782 virtual void nosharing() {array->nosharing();}
00783
00784 virtual void erase(uint32_t i, uint32_t j) {
00785 array->erase(array->begin()+i, array->begin()+j);}
00786 virtual void swap(uint32_t i, uint32_t j) {
00787 float tmp = (*array)[i];
00788 (*array)[i] = (*array)[j];
00789 (*array)[j] = tmp;}
00790
00791 void swap(colFloats& rhs) {
00792 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00793 array_t<float>* a = rhs.array; rhs.array = array; array = a;}
00794 virtual void reduce(const array_t<uint32_t>& starts);
00795 virtual void reduce(const array_t<uint32_t>& starts,
00796 ibis::selectClause::AGREGADO func);
00797
00798
00799 virtual uint32_t write(FILE* fptr) const {
00800 if (array) {
00801 uint32_t nelm = array->size();
00802 return nelm - fwrite(array->begin(), sizeof(float), nelm, fptr);
00803 }
00804 else {
00805 return 0;
00806 }
00807 }
00808
00809 virtual void write(std::ostream& out, uint32_t i) const {
00810 out << (*array)[i];}
00811
00812 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00813 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00814 colList::iterator head, colList::iterator tail);
00815 virtual void sort(uint32_t i, uint32_t j,
00816 array_t<uint32_t>& neworder) const;
00817 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00818 virtual void reorder(const array_t<uint32_t>& ind)
00819 {ibis::util::reorder(*array, ind);}
00820 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00821 {array->topk(k, ind);}
00822 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00823 {array->bottomk(k, ind);}
00824 virtual long truncate(uint32_t keep);
00825 virtual long truncate(uint32_t keep, uint32_t start);
00826
00827 virtual double getMin() const;
00828 virtual double getMax() const;
00829 virtual double getSum() const;
00830 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00831 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00832 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00833 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00834 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00835 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00836
00837 private:
00838 array_t<float>* array;
00839
00840 colFloats(const colFloats&);
00841 colFloats& operator=(const colFloats&);
00842 };
00843
00845 class FASTBIT_CXX_DLLSPEC ibis::colDoubles : public ibis::colValues {
00846 public:
00847 colDoubles() : colValues(), array(0) {};
00848 colDoubles(const ibis::column* c, const ibis::bitvector& hits)
00849 : colValues(c), array(c->selectDoubles(hits)) {}
00850 colDoubles(const ibis::column* c, ibis::fileManager::storage* store,
00851 const uint32_t start, const uint32_t end)
00852 : colValues(c), array(new array_t<double>(store, start, end)) {}
00853 colDoubles(const ibis::column* c);
00854 colDoubles(size_t n, double v) : array(new array_t<double>(n, v)) {}
00855 virtual ~colDoubles() {delete array;}
00856
00857 virtual bool empty() const {return (col==0 || array==0);}
00858 virtual uint32_t size() const {return (array ? array->size() : 0);}
00859 virtual uint32_t elementSize() const {return sizeof(double);}
00860 virtual ibis::TYPE_T getType() const {return ibis::DOUBLE;}
00861 virtual void* getArray() const {return array;}
00862 virtual void nosharing() {array->nosharing();}
00863
00864 virtual void erase(uint32_t i, uint32_t j) {
00865 array->erase(array->begin()+i, array->begin()+j);}
00866 virtual void swap(uint32_t i, uint32_t j) {
00867 double tmp = (*array)[i];
00868 (*array)[i] = (*array)[j];
00869 (*array)[j] = tmp;}
00870
00871 void swap(colDoubles& rhs) {
00872 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00873 array_t<double>* a = rhs.array; rhs.array = array; array = a;}
00874 virtual void reduce(const array_t<uint32_t>& starts);
00875 virtual void reduce(const array_t<uint32_t>& starts,
00876 ibis::selectClause::AGREGADO func);
00877
00878
00879 virtual uint32_t write(FILE* fptr) const {
00880 if (array) {
00881 uint32_t nelm = array->size();
00882 return nelm - fwrite(array->begin(), sizeof(double), nelm, fptr);
00883 }
00884 else {
00885 return 0;
00886 }
00887 }
00888
00889 virtual void write(std::ostream& out, uint32_t i) const {
00890 out.precision(12); out << (*array)[i];}
00891
00892 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00893 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00894 colList::iterator head, colList::iterator tail);
00895 virtual void sort(uint32_t i, uint32_t j,
00896 array_t<uint32_t>& neworder) const;
00897 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00898 virtual void reorder(const array_t<uint32_t>& ind)
00899 {ibis::util::reorder(*array, ind);}
00900 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const
00901 {array->topk(k, ind);}
00902 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const
00903 {array->bottomk(k, ind);}
00904 virtual long truncate(uint32_t keep);
00905 virtual long truncate(uint32_t keep, uint32_t start);
00906
00907 virtual double getMin() const;
00908 virtual double getMax() const;
00909 virtual double getSum() const;
00910 virtual int32_t getInt(uint32_t i) const {return (int32_t)(*array)[i];}
00911 virtual uint32_t getUInt(uint32_t i) const {return (uint32_t)(*array)[i];}
00912 virtual int64_t getLong(uint32_t i) const {return (int64_t)(*array)[i];}
00913 virtual uint64_t getULong(uint32_t i) const {return (uint64_t)(*array)[i];}
00914 virtual float getFloat(uint32_t i) const {return (float)(*array)[i];};
00915 virtual double getDouble(uint32_t i) const {return (double)(*array)[i];};
00916
00917 private:
00918 array_t<double>* array;
00919
00920 colDoubles(const colDoubles&);
00921 colDoubles& operator=(const colDoubles&);
00922 };
00923
00925 class FASTBIT_CXX_DLLSPEC ibis::colStrings : public ibis::colValues {
00926 public:
00927 colStrings() : colValues(), array(0) {};
00928 colStrings(const ibis::column* c, const ibis::bitvector& hits)
00929 : colValues(c), array(c->selectStrings(hits)) {}
00930 colStrings(const ibis::column* c);
00931 colStrings(size_t n, const std::string& v)
00932 : array(new std::vector<std::string>(n, v)) {}
00933 virtual ~colStrings() {delete array;}
00934
00935 virtual bool empty() const {return (col==0 || array==0);}
00936 virtual uint32_t size() const {return (array ? array->size() : 0);}
00937 virtual uint32_t elementSize() const {return 0;}
00938 virtual ibis::TYPE_T getType() const {return col->type();}
00939 virtual void* getArray() const {return array;}
00940 virtual void nosharing() {}
00941
00942 virtual void erase(uint32_t i, uint32_t j) {
00943 array->erase(array->begin()+i, array->begin()+j);}
00944 virtual void swap(uint32_t i, uint32_t j) {(*array)[i].swap((*array)[j]);}
00945
00946 void swap(colStrings& rhs) {
00947 const ibis::column* c = rhs.col; rhs.col = col; col = c;
00948 std::vector<std::string>* a = rhs.array; rhs.array = array; array = a;}
00949 virtual void reduce(const array_t<uint32_t>& starts);
00950 virtual void reduce(const array_t<uint32_t>& starts,
00951 ibis::selectClause::AGREGADO func);
00952
00953
00954 virtual uint32_t write(FILE* fptr) const;
00955
00956 virtual void write(std::ostream& out, uint32_t i) const {
00957 out << '"' << (*array)[i] << '"';}
00958
00959 virtual void sort(uint32_t i, uint32_t j, bundle* bdl);
00960 virtual void sort(uint32_t i, uint32_t j, bundle* bdl,
00961 colList::iterator head, colList::iterator tail);
00962 virtual void sort(uint32_t i, uint32_t j,
00963 array_t<uint32_t>& neworder) const;
00964 virtual array_t<uint32_t>* segment(const array_t<uint32_t>* old=0) const;
00965 virtual void reorder(const array_t<uint32_t>& ind);
00966 virtual void topk(uint32_t k, array_t<uint32_t> &ind) const;
00967 virtual void bottomk(uint32_t k, array_t<uint32_t> &ind) const;
00968 virtual long truncate(uint32_t keep);
00969 virtual long truncate(uint32_t keep, uint32_t start);
00970
00972 virtual double getMin() const {return FASTBIT_DOUBLE_NULL;}
00974 virtual double getMax() const {return FASTBIT_DOUBLE_NULL;}
00976 virtual double getSum() const {return FASTBIT_DOUBLE_NULL;}
00978 virtual int32_t getInt(uint32_t) const {return 0;}
00980 virtual uint32_t getUInt(uint32_t) const {return 0;}
00982 virtual int64_t getLong(uint32_t) const {return 0;}
00984 virtual uint64_t getULong(uint32_t) const {return 0;}
00986 virtual float getFloat(uint32_t) const {return FASTBIT_FLOAT_NULL;}
00988 virtual double getDouble(uint32_t) const {return FASTBIT_DOUBLE_NULL;}
00989
00990 private:
00992 std::vector<std::string>* array;
00993
00994 colStrings(const colStrings&);
00995 colStrings& operator=(const colStrings&);
00996
00997 void sortsub(uint32_t i, uint32_t j, array_t<uint32_t>& ind) const;
00998 uint32_t partitionsub(uint32_t, uint32_t, array_t<uint32_t>&) const;
00999 };
01000 #endif