18 #ifndef JUBATUS_CORE_STORAGE_ABSTRACT_COLUMN_HPP_
19 #define JUBATUS_CORE_STORAGE_ABSTRACT_COLUMN_HPP_
27 #include <msgpack.hpp>
28 #include "jubatus/util/lang/demangle.h"
29 #include "jubatus/util/lang/noncopyable.h"
30 #include "../common/assert.hpp"
31 #include "../framework/packer.hpp"
54 #define JUBATUS_GEN_FUNCTIONS_(tp) \
55 virtual void push_back(const tp& value) { \
56 throw type_unmatch_exception( \
57 "column: invalid type in push_back(): " \
58 "expected: " + my_type_.type_as_string() + ", " \
59 "actual: " + jubatus::util::lang::get_typename<tp>()); \
61 virtual bool insert(uint64_t target, const tp&) { \
62 throw type_unmatch_exception( \
63 "column: invalid type in insert(): " \
64 "expected: " + my_type_.type_as_string() + ", " \
65 "actual: " + jubatus::util::lang::get_typename<tp>()); \
67 virtual bool update(uint64_t target, const tp&) { \
68 throw type_unmatch_exception( \
69 "column: invalid type in update(): " \
70 "expected: " + my_type_.type_as_string() + ", " \
71 "actual: " + jubatus::util::lang::get_typename<tp>()); \
87 #undef JUBATUS_GEN_FUNCTIONS_
89 virtual bool remove(uint64_t target) = 0;
90 virtual void clear() = 0;
94 virtual void dump(std::ostream& os, uint64_t target)
const = 0;
102 template <
typename T>
109 using detail::abstract_column_base::push_back;
110 using detail::abstract_column_base::insert;
111 using detail::abstract_column_base::update;
120 bool insert(uint64_t target,
const T& value) {
121 if (
size() < target) {
127 bool insert(uint64_t target,
const msgpack::object& obj) {
131 bool update(uint64_t index,
const T& value) {
132 if (
size() <= index) {
138 bool update(uint64_t target,
const msgpack::object& obj) {
142 bool remove(uint64_t target) {
143 if (
size() <= target) {
160 if (
size() <= index) {
163 jubatus::util::lang::lexical_cast<std::string>(index) +
165 jubatus::util::lang::lexical_cast<std::string>(
array_.size()));
171 if (
size() <= index) {
174 jubatus::util::lang::lexical_cast<std::string>(index) +
176 jubatus::util::lang::lexical_cast<std::string>(
array_.size()));
183 pk.pack((*
this)[index]);
188 os <<
"[column (" << it.
type().type_as_string() <<
")"
189 <<
" size:" << it.
size() <<
" {" << std::endl;
190 for (
size_t i = 0; i < it.
size(); ++i) {
193 os <<
"} ]" << std::endl;
197 void dump(std::ostream& os, uint64_t target)
const {
198 os <<
"[" << target <<
"] " << (*this)[target] << std::endl;
201 template<
class Buffer>
220 using detail::abstract_column_base::push_back;
221 using detail::abstract_column_base::insert;
222 using detail::abstract_column_base::update;
225 check_bit_vector_(value);
236 check_bit_vector_(value);
238 if (
size() < target) {
242 array_.begin() + target * blocks_per_value_(),
243 blocks_per_value_(), 0);
247 bool insert(uint64_t target,
const msgpack::object& obj) {
254 check_bit_vector_(value);
256 if (
size() < index) {
262 bool update(uint64_t index,
const msgpack::object& obj) {
270 return array_.size() / blocks_per_value_();
273 return bit_vector(get_data_at_(index),
type().bit_vector_length());
276 return bit_vector(get_data_at_(index),
type().bit_vector_length());
278 bool remove(uint64_t target) {
279 if (target >=
size()) {
282 if (target <
size() - 1) {
283 const void* back = get_data_at_(
size() - 1);
284 memcpy(get_data_at_(target), back, bytes_per_value_());
295 pk.pack((*
this)[index]);
300 os <<
"[column (bit_vector)"
301 <<
" size:" << c.
size() <<
" {" << std::endl;
302 for (
size_t i = 0; i < c.
size(); ++i) {
305 os <<
"} ]" << std::endl;
309 void dump(std::ostream& os, uint64_t target)
const {
310 os <<
"[" << target <<
"] " << (*this)[target] << std::endl;
313 template<
class Buffer>
328 return (bytes_per_value_() +
sizeof(uint64_t) - 1) /
sizeof(uint64_t);
333 return &array_[blocks_per_value_() * index];
337 return &array_[blocks_per_value_() * index];
342 memcpy(get_data_at_(index), raw_data, bytes_per_value_());
344 memset(get_data_at_(index), 0, bytes_per_value_());
350 if (tested.
bit_num() > bit_num_expected) {
352 "invalid length of bit_vector (" +
353 jubatus::util::lang::lexical_cast<std::string>(tested.
bit_num()) +
", "
355 jubatus::util::lang::lexical_cast<std::string>(bit_num_expected) +
")");
425 return base_->type();
428 template <
typename T>
431 base_->push_back(value);
434 template <
typename T>
435 bool insert(uint64_t index,
const T& value) {
437 return base_->insert(index, value);
439 template <
typename T>
440 bool update(uint64_t index,
const T& value) {
442 return base_->update(index, value);
444 bool remove(uint64_t index) {
446 return base_->remove(index);
455 base_->pack_with_index(index, pk);
464 void dump(std::ostream& os, uint64_t target)
const {
466 base_->dump(os, target);
476 template<
class Buffer>
480 packer.pack_array(2);
484 static_cast<const uint8_column&
>(*base_).pack_array(packer);
486 static_cast<const uint16_column&
>(*base_).pack_array(packer);
488 static_cast<const uint32_column&
>(*base_).pack_array(packer);
490 static_cast<const uint64_column&
>(*base_).pack_array(packer);
492 static_cast<const int8_column&
>(*base_).pack_array(packer);
494 static_cast<const int16_column&
>(*base_).pack_array(packer);
496 static_cast<const int32_column&
>(*base_).pack_array(packer);
498 static_cast<const int64_column&
>(*base_).pack_array(packer);
500 static_cast<const float_column&
>(*base_).pack_array(packer);
502 static_cast<const double_column&
>(*base_).pack_array(packer);
504 static_cast<const string_column&
>(*base_).pack_array(packer);
506 static_cast<const bit_vector_column&
>(*base_).pack_array(packer);
512 if (o.type != msgpack::type::ARRAY || o.via.array.size != 2) {
513 throw msgpack::type_error();
515 msgpack::object*
objs = o.via.array.ptr;
518 objs[0].convert(&type);
527 "column: invalid type in serialize(): "
529 jubatus::util::lang::lexical_cast<std::string>(
base_->type()) +
531 jubatus::util::lang::lexical_cast<std::string>(type));
535 static_cast<uint8_column&
>(*tmp.
base_).unpack_array(objs[1]);
537 static_cast<uint16_column&
>(*tmp.
base_).unpack_array(objs[1]);
539 static_cast<uint32_column&
>(*tmp.
base_).unpack_array(objs[1]);
541 static_cast<uint64_column&
>(*tmp.
base_).unpack_array(objs[1]);
543 static_cast<int8_column&
>(*tmp.
base_).unpack_array(objs[1]);
545 static_cast<int16_column&
>(*tmp.
base_).unpack_array(objs[1]);
547 static_cast<int32_column&
>(*tmp.
base_).unpack_array(objs[1]);
549 static_cast<int64_column&
>(*tmp.
base_).unpack_array(objs[1]);
551 static_cast<float_column&
>(*tmp.
base_).unpack_array(objs[1]);
553 static_cast<double_column&
>(*tmp.
base_).unpack_array(objs[1]);
555 static_cast<string_column&
>(*tmp.
base_).unpack_array(objs[1]);
557 static_cast<bit_vector_column&
>(*tmp.
base_).unpack_array(objs[1]);
566 jubatus::util::lang::shared_ptr<abstract_column_base>
base_;
575 #endif // JUBATUS_CORE_STORAGE_ABSTRACT_COLUMN_HPP_
const typed_column< int16_t > const_int16_column
const typed_column< int64_t > const_int64_column
typed_column< std::string > string_column
JUBATUS_GEN_FUNCTIONS_(uint8_t)
typed_column(const column_type &type)
void msgpack_unpack(msgpack::object o)
const uint64_t * get_data_at_(size_t index) const
bool update(uint64_t index, const bit_vector &value)
void dump(std::ostream &os, uint64_t target) const
bool update(uint64_t index, const T &value)
#define JUBATUS_ASSERT_EQ(a, b, messages)
size_t blocks_per_value_() const
void unpack_array(msgpack::object o)
#define JUBATUS_ASSERT_UNREACHABLE()
void update_at_(size_t index, const void *raw_data)
typed_column< uint16_t > uint16_column
static size_t memory_size(size_t bit_width)
void pack_array(msgpack::packer< Buffer > &packer) const
typed_column< uint32_t > uint32_column
void push_back(const msgpack::object &obj)
const typed_column< uint64_t > const_uint64_column
const typed_column< uint8_t > const_uint8_column
typed_column< float > float_column
typed_column< int32_t > int32_column
bool is(const type_name &type) const
void push_back(const bit_vector &value)
bool update(uint64_t index, const T &value)
void dump(std::ostream &os, uint64_t target) const
virtual void dump(std::ostream &os, uint64_t target) const =0
bool insert(uint64_t index, const T &value)
const T & operator[](uint64_t index) const
typed_column< int64_t > int64_column
void push_back(const T &value)
void msgpack_pack(msgpack::packer< Buffer > &packer) const
bit_vector operator[](uint64_t index)
bit_base * raw_data_unsafe()
const bit_vector_column const_bit_vector_column
const typed_column< int8_t > const_int8_column
void pack_array(msgpack::packer< Buffer > &packer) const
bool insert(uint64_t target, const T &value)
#define JUBATUS_ASSERT(expr)
bool update(uint64_t index, const msgpack::object &obj)
size_t bit_vector_length() const
const typed_column< std::string > const_string_column
const typed_column< double > const_double_column
void pack_with_index(uint64_t index, framework::packer &pk) const
#define JUBATUS_ASSERT_GE(a, b, messages)
void unpack_array(msgpack::object o)
bool insert(uint64_t target, const msgpack::object &obj)
typed_column< uint8_t > uint8_column
typed_column< uint64_t > uint64_column
const typed_column< uint16_t > const_uint16_column
typed_column(const column_type &type)
bit_vector operator[](uint64_t index) const
jubatus::util::lang::shared_ptr< abstract_column_base > base_
void swap(weighted_point &p1, weighted_point &p2)
const typed_column< uint32_t > const_uint32_column
void dump(std::ostream &os, uint64_t target) const
virtual void pack_with_index(const uint64_t index, framework::packer &pk) const
msgpack::packer< jubatus_packer > packer
bit_vector_base< uint64_t > bit_vector
typed_column< double > double_column
void swap(lsh_vector &l, lsh_vector &r)
vector< msgpack::object > objs
bool insert(uint64_t target, const msgpack::object &obj)
bool insert(uint64_t target, const bit_vector &value)
friend void swap(abstract_column &l, abstract_column &r)
void pack_with_index(const uint64_t index, framework::packer &pk) const
void swap(abstract_column &x)
friend std::ostream & operator<<(std::ostream &os, const typed_column< bit_vector > &c)
typed_column< int16_t > int16_column
void push_back(const msgpack::object &obj)
typed_column< bit_vector > bit_vector_column
T & operator[](uint64_t index)
size_t bytes_per_value_() const
const typed_column< int32_t > const_int32_column
std::vector< uint64_t > array_
friend std::ostream & operator<<(std::ostream &os, const typed_column< T > &it)
void pack_with_index(const uint64_t index, framework::packer &pk) const
uint64_t * get_data_at_(size_t index)
const typed_column< float > const_float_column
virtual ~abstract_column_base()
abstract_column(const column_type &type)
abstract_column_base(const column_type &type)
void check_bit_vector_(const bit_vector &tested) const
bool update(uint64_t target, const msgpack::object &obj)
void push_back(const T &value)
typed_column< int8_t > int8_column
#define JUBATUS_ASSERT_LT(a, b, messages)