00001
00002
00003
00004 #ifndef AITOOLS_INVERTEDINDEX_PAIR_STRING_HPP
00005 #define AITOOLS_INVERTEDINDEX_PAIR_STRING_HPP
00006
00007 #include "Value.hpp"
00008 #include <iostream>
00009 #include <cassert>
00010 #include <cstring>
00011 #include <iomanip>
00012
00013 namespace aitools {
00014 namespace invertedindex {
00015
00025 template <typename T>
00026 class PairString : public Value
00027 {
00028
00029 public:
00030
00031 typedef T element_type;
00032
00033 public:
00034
00035 static const std::string classname;
00036
00037 static const size_t sizeof_T = sizeof(T);
00038
00039 public:
00040
00044 PairString();
00045
00049 PairString(T e1, const std::string& e2);
00050
00054 PairString(const PairString<T>& pair);
00055
00059 virtual ~PairString();
00060
00061 public:
00062
00063 void clear();
00064
00065 double score() const;
00066
00067 bool operator==(const PairString<T>& pair) const;
00068
00069 bool operator!=(const PairString<T>& pair) const;
00070
00071 bool operator>(const PairString<T>& pair) const;
00072
00073 bool operator<(const PairString<T>& pair) const;
00074
00075 void parse(std::istream& is);
00076
00077 T& e1();
00078
00079 const T& e1() const;
00080
00081 std::string& e2();
00082
00083 const std::string& e2() const;
00084
00085 void print(std::ostream& os) const;
00086
00087 void to_bytes(ByteBuffer& buffer) const;
00088
00089 void wrap(const char* data, size_t size);
00090
00091 void wrap(const ByteBuffer& buffer);
00092
00093 private:
00094
00095 T e1_;
00096 std::string e2_;
00097
00098 };
00099
00100
00101
00102 template <typename T>
00103 const std::string
00104 PairString<T>::classname
00105 ("PairString<" + Converter::nameof<T>() + ">");
00106
00107 template <typename T>
00108 PairString<T>::PairString()
00109 : e1_(0)
00110 {}
00111
00112 template <typename T>
00113 PairString<T>::PairString(T e1, const std::string& e2)
00114 : e1_(e1),
00115 e2_(e2)
00116 {}
00117
00118 template <typename T>
00119 PairString<T>::PairString(const PairString<T>& pair)
00120 : e1_(pair.e1_),
00121 e2_(pair.e2_)
00122 {}
00123
00124 template <typename T>
00125 PairString<T>::~PairString()
00126 {}
00127
00128 template <typename T>
00129 void
00130 PairString<T>::clear()
00131 {
00132 e1_ = 0;
00133 e2_.clear();
00134 }
00135
00136 template <typename T>
00137 double
00138 PairString<T>::score() const
00139 {
00140 return e1_;
00141 }
00142
00143 template <typename T>
00144 bool
00145 PairString<T>::operator==(const PairString<T>& pair) const
00146 {
00147 return e1_ == pair.e1_ && e2_ == pair.e2_;
00148 }
00149
00150 template <typename T>
00151 bool
00152 PairString<T>::operator!=(const PairString<T>& pair) const
00153 {
00154 return !(*this == pair);
00155 }
00156
00157 template <typename T>
00158 bool
00159 PairString<T>::operator>(const PairString<T>& pair) const
00160 {
00161 return score() > pair.score();
00162 }
00163
00164 template <typename T>
00165 bool
00166 PairString<T>::operator<(const PairString<T>& pair) const
00167 {
00168 return score() < pair.score();
00169 }
00170
00171 template <typename T>
00172 void
00173 PairString<T>::parse(std::istream& is)
00174 {
00175
00176 if (sizeof_T == sizeof_int8_t) is >> tmp_int, e1_ = tmp_int;
00177 else is >> e1_;
00178 is >> e2_;
00179 }
00180
00181 template <typename T>
00182 T&
00183 PairString<T>::e1()
00184 {
00185 return e1_;
00186 }
00187
00188 template <typename T>
00189 const T&
00190 PairString<T>::e1() const
00191 {
00192 return e1_;
00193 }
00194
00195 template <typename T>
00196 std::string&
00197 PairString<T>::e2()
00198 {
00199 return e2_;
00200 }
00201
00202 template <typename T>
00203 const std::string&
00204 PairString<T>::e2() const
00205 {
00206 return e2_;
00207 }
00208
00209 template <typename T>
00210 void
00211 PairString<T>::print(std::ostream& os) const
00212 {
00213
00214 if (sizeof_T == sizeof_int8_t) os << (int) e1_;
00215 else os << e1_;
00216 os << ' ' << e2_;
00217 }
00218
00219 template <typename T>
00220 void
00221 PairString<T>::to_bytes(ByteBuffer& buffer) const
00222 {
00223 buffer.resize(sizeof_T + e2_.size());
00224 std::memcpy(buffer.data(), &e1_, sizeof_T);
00225 std::memcpy(buffer.data() + sizeof_T, e2_.data(), e2_.size());
00226 }
00227
00228 template <typename T>
00229 void
00230 PairString<T>::wrap(const char* data, size_t size)
00231 {
00232 assert(data != NULL);
00233 assert(size > sizeof_T);
00234 std::memcpy(&e1_, data, sizeof_T);
00235 e2_.assign(data + sizeof_T, size - sizeof_T);
00236 }
00237
00238 template <typename T>
00239 void
00240 PairString<T>::wrap(const ByteBuffer& buffer)
00241 {
00242 Value::wrap(buffer);
00243 }
00244
00245 }
00246 }
00247
00248 #endif // AITOOLS_INVERTEDINDEX_PAIR_STRING_HPP