00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00019
00020 #ifndef TESSERACT_CCUTIL_UNICITY_TABLE_H_
00021 #define TESSERACT_CCUTIL_UNICITY_TABLE_H_
00022
00023 #include "callback.h"
00024 #include "errcode.h"
00025 #include "genericvector.h"
00026
00027
00028
00029
00030
00031
00032 template <typename T>
00033 class UnicityTable {
00034 public:
00035 UnicityTable();
00037 ~UnicityTable();
00038
00041 void reserve(int size);
00042
00044 int size() const;
00045
00047 T get(int id) const;
00048
00052 int get_id(T object) const;
00053
00055 bool contains(T object) const;
00056
00058 T contains_id(int id) const;
00059
00061 int push_back(T object);
00062
00065 void set_clear_callback(Callback1<T>* cb);
00066
00069 void set_compare_callback(ResultCallback2<bool, T const &, T const &>* cb);
00070
00075 void clear();
00076
00079 void move(UnicityTable<T>* from);
00080
00085 bool write(FILE* f, ResultCallback2<bool, FILE*, T const &>* cb);
00087 bool read(FILE* f, ResultCallback3<bool, FILE*, T*, bool>* cb, bool swap);
00088
00089 private:
00090 GenericVector<T> table_;
00091
00092 mutable ResultCallback2<bool, T const &, T const &>* compare_cb_;
00093 };
00094
00095 template <typename T>
00096 class UnicityTableEqEq : public UnicityTable<T> {
00097 public:
00098 UnicityTableEqEq() {
00099 UnicityTable<T>::set_compare_callback(
00100 NewPermanentCallback(tesseract::cmp_eq<T>));
00101 }
00102 };
00103
00104 template <typename T>
00105 UnicityTable<T>::UnicityTable() :
00106 compare_cb_(0) {
00107 }
00108
00109
00110 template <typename T>
00111 UnicityTable<T>::~UnicityTable() {
00112 clear();
00113 }
00114
00115 template <typename T>
00116 int UnicityTable<T>::size() const{
00117 return table_.size();
00118 }
00119
00120
00121
00122 template <typename T>
00123 void UnicityTable<T>::reserve(int size) {
00124 table_.reserve(size);
00125 }
00126
00127
00128 template <typename T>
00129 T UnicityTable<T>::get(int id) const {
00130 return table_.get(id);
00131 }
00132
00133
00134 template <typename T>
00135 T UnicityTable<T>::contains_id(int id) const {
00136 return table_.contains_index(id);
00137 }
00138
00139
00140 template <typename T>
00141 int UnicityTable<T>::get_id(T object) const {
00142 return table_.get_index(object);
00143 }
00144
00145
00146 template <typename T>
00147 bool UnicityTable<T>::contains(T object) const {
00148 return get_id(object) != -1;
00149 }
00150
00151
00152 template <typename T>
00153 int UnicityTable<T>::push_back(T object) {
00154 int idx = get_id(object);
00155 if (idx == -1) {
00156 idx = table_.push_back(object);
00157 }
00158 return idx;
00159 }
00160
00161
00162
00163 template <typename T>
00164 void UnicityTable<T>::set_clear_callback(Callback1<T>* cb) {
00165 table_.set_clear_callback(cb);
00166 }
00167
00168
00169
00170 template <typename T>
00171 void UnicityTable<T>::set_compare_callback(ResultCallback2<bool, T const &, T const &>* cb) {
00172 table_.set_compare_callback(cb);
00173 compare_cb_ = cb;
00174 }
00175
00176
00177 template <typename T>
00178 void UnicityTable<T>::clear() {
00179 table_.clear();
00180 }
00181
00182 template <typename T>
00183 bool UnicityTable<T>::write(FILE* f,
00184 ResultCallback2<bool, FILE*, T const &>* cb) {
00185 return table_.write(f, cb);
00186 }
00187
00188 template <typename T>
00189 bool UnicityTable<T>::read(
00190 FILE* f, ResultCallback3<bool, FILE*, T*, bool>* cb, bool swap) {
00191 return table_.read(f, cb, swap);
00192 }
00193
00194
00195
00196 template <typename T>
00197 void UnicityTable<T>::move(UnicityTable<T>* from) {
00198 table_.move(&from->table_);
00199 }
00200
00201 #endif // TESSERACT_CCUTIL_UNICITY_TABLE_H_