00001 #include "GenericRecord.hpp"
00002 #include <boost/algorithm/string.hpp>
00003 #include <cstdio>
00004
00005 namespace aitools {
00006 namespace invertedindex {
00007
00008 const size_t
00009 GenericRecord::max_key_size(std::numeric_limits<uint16_t>::max());
00010
00011 const size_t
00012 GenericRecord::max_val_size(std::numeric_limits<uint16_t>::max());
00013
00014 GenericRecord::GenericRecord()
00015 : key_size_(0),
00016 val_size_(0)
00017 {}
00018
00019 GenericRecord::GenericRecord(const GenericRecord& record)
00020 : key_(record.key_),
00021 val_(record.val_),
00022 key_size_(0),
00023 val_size_(0)
00024 {}
00025
00026 GenericRecord::GenericRecord(const std::string& key, const ByteBuffer& value)
00027 : key_(key),
00028 val_(value),
00029 key_size_(0),
00030 val_size_(0)
00031 {}
00032
00033 GenericRecord::~GenericRecord()
00034 {}
00035
00036 std::string&
00037 GenericRecord::key()
00038 {
00039 return key_;
00040 }
00041
00042 const std::string&
00043 GenericRecord::key() const
00044 {
00045 return key_;
00046 }
00047
00048 GenericRecord&
00049 GenericRecord::operator=(const GenericRecord& record)
00050 {
00051 key_ = record.key_;
00052 val_ = record.val_;
00053 return *this;
00054 }
00055
00056 bool
00057 GenericRecord::operator==(const GenericRecord& record) const
00058 {
00059 return key_ == record.key_ && val_ == record.val_;
00060 }
00061
00062 bool
00063 GenericRecord::operator!=(const GenericRecord& record) const
00064 {
00065 return !(*this == record);
00066 }
00067
00068 ByteBuffer&
00069 GenericRecord::value()
00070 {
00071 return val_;
00072 }
00073
00074 const ByteBuffer&
00075 GenericRecord::value() const
00076 {
00077 return val_;
00078 }
00079
00080 bool
00081 GenericRecord::write(FILE* file)
00082 {
00083 key_size_ = key_.size();
00084 val_size_ = val_.size();
00085 if (std::fwrite(&key_size_, sizeof_key_size_t, 1, file) != 1) return false;
00086 if (std::fwrite(&val_size_, sizeof_val_size_t, 1, file) != 1) return false;
00087 if (std::fwrite(key_.data(), 1, key_size_, file) != key_size_) return false;
00088 if (std::fwrite(val_.data(), 1, val_size_, file) != val_size_) return false;
00089 return true;
00090 }
00091
00092 bool
00093 GenericRecord::read(FILE* file)
00094 {
00095 key_.clear();
00096
00097 if (std::fread(&key_size_, sizeof_key_size_t, 1, file) != 1) return false;
00098 if (std::fread(&val_size_, sizeof_val_size_t, 1, file) != 1) return false;
00099 key_.resize(key_size_);
00100 val_.resize(val_size_);
00101 if (std::fread((void*)key_.data(), 1, key_size_, file) != key_size_)
00102 return false;
00103 if (std::fread(val_.data(), 1, val_size_, file) != val_size_) return false;
00104 return true;
00105 }
00106
00107 size_t
00108 GenericRecord::size() const
00109 {
00110 return sizeof_key_size_t + sizeof_val_size_t + key_.size() + val_.size();
00111 }
00112
00113 }
00114 }
00115
00116 namespace std {
00117
00118 ostream&
00119 operator<<(ostream& os, const aitools::invertedindex::GenericRecord& record)
00120 {
00121 if (os)
00122 {
00123 os << "GenericRecord [ key = " << record.key()
00124 << " , value = " << record.value() << " ]";
00125 }
00126 return os;
00127 }
00128
00129 }