00001 /* Copyright (C) 2010 webis.de 00002 * All rights reserved. 00003 */ 00004 #ifndef AITOOLS_INVERTEDINDEX_POSTLIST_HPP 00005 #define AITOOLS_INVERTEDINDEX_POSTLIST_HPP 00006 00007 #include "Iterator.hpp" 00008 #include <typeinfo> 00009 #include <cassert> 00010 00011 namespace aitools { 00012 namespace invertedindex { 00013 00023 template<typename Value> 00024 class Postlist { 00025 00026 public: // c'tor / d'tor 00027 00028 Postlist(); 00029 00030 Postlist(const Iterator::SharedPointer& iterator); 00031 00032 Postlist(const Postlist& postlist); 00033 00034 ~Postlist(); 00035 00036 public: // member 00037 00038 void info(std::ostream& os) const; 00039 00040 bool is_empty() const; 00041 00042 bool is_paged() const; 00043 00044 Iterator::SharedPointer& iterator(); 00045 00046 size_t length() const; 00047 00048 bool next(Value& value); 00049 00050 Postlist& operator=(const Postlist& postlist); 00051 00052 Postlist& operator=(const Iterator::SharedPointer& iterator); 00053 00054 size_t payload() const; 00055 00056 void reset(); 00057 00058 private: // data 00059 00060 Iterator::SharedPointer iterator_; 00061 00062 }; 00063 00064 // IMPLEMENTATION 00065 00066 template<typename Value> 00067 Postlist<Value>::Postlist() 00068 : iterator_(new Iterator) 00069 {} 00070 00071 template<typename Value> 00072 Postlist<Value>::Postlist(const Iterator::SharedPointer& iterator) 00073 : iterator_(iterator) 00074 { 00075 assert(iterator); 00076 } 00077 00078 template<typename Value> 00079 Postlist<Value>::Postlist(const Postlist& postlist) 00080 : iterator_(postlist.iterator_) 00081 { 00082 assert(postlist.iterator_); 00083 } 00084 00085 template<typename Value> 00086 Postlist<Value>::~Postlist() 00087 {} 00088 00089 template<typename Value> 00090 void 00091 Postlist<Value>::info(std::ostream& os) const 00092 { 00093 os << "Postlist<" << Value::classname << "> [ " 00094 << "length = " << iterator_->header().value_count << ", " 00095 << "payload = " << iterator_->header().payload << ", " 00096 << "is_paged = " << iterator_->is_paged() << " ]"; 00097 } 00098 00099 template<typename Value> 00100 bool 00101 Postlist<Value>::is_empty() const 00102 { 00103 return iterator_->header().value_count == 0; 00104 } 00105 00106 template<typename Value> 00107 bool 00108 Postlist<Value>::is_paged() const 00109 { 00110 return iterator_->is_paged(); 00111 } 00112 00113 template<typename Value> 00114 Iterator::SharedPointer& 00115 Postlist<Value>::iterator() 00116 { 00117 return iterator_; 00118 } 00119 00120 template<typename Value> 00121 size_t 00122 Postlist<Value>::length() const 00123 { 00124 return iterator_->header().value_count; 00125 } 00126 00127 template<typename Value> 00128 bool 00129 Postlist<Value>::next(Value& value) 00130 { 00131 if (!iterator_->is_valid()) return false; 00132 value.wrap(iterator_->value(), iterator_->size()); 00133 iterator_->advance(); 00134 return true; 00135 } 00136 00137 template<typename Value> 00138 Postlist<Value>& 00139 Postlist<Value>::operator=(const Postlist& postlist) 00140 { 00141 assert(postlist.iterator_); 00142 iterator_ = postlist.iterator_; 00143 return *this; 00144 } 00145 00146 template<typename Value> 00147 Postlist<Value>& 00148 Postlist<Value>::operator=(const Iterator::SharedPointer& iterator) 00149 { 00150 assert(iterator); 00151 iterator_ = iterator; 00152 return *this; 00153 } 00154 00155 template<typename Value> 00156 size_t 00157 Postlist<Value>::payload() const 00158 { 00159 return iterator_->header().payload; 00160 } 00161 00162 template<typename Value> 00163 void 00164 Postlist<Value>::reset() 00165 { 00166 iterator_->rewind(); 00167 } 00168 00169 } // namespace invertedindex 00170 } // namespace aitools 00171 00172 namespace std { 00173 00174 template<typename Value> ostream& 00175 operator<<(ostream& os, const aitools::invertedindex::Postlist<Value>& pl) 00176 { 00177 if (os) pl.info(os); 00178 return os; 00179 } 00180 } // namespace std 00181 00182 #endif // AITOOLS_INVERTEDINDEX_POSTLIST_HPP