42 explicit internal_diff_object(
const vector<diff_object>& diffs)
46 void convert_binary(
packer& pk)
const {
47 pk.pack_array(
diffs_.size());
48 for (
size_t i = 0; i <
diffs_.size(); i++) {
49 diffs_[i]->convert_binary(pk);
57 size_t count_mixable(
const vector<mixable*>& mixables) {
59 for (
size_t i = 0; i < mixables.size(); i++) {
60 if (dynamic_cast<T*>(mixables[i])) {
73 if (count_mixable<linear_mixable>(
mixables_) > 0) {
74 s.insert(
"linear_mixable");
77 if (count_mixable<push_mixable>(
mixables_) > 0) {
78 s.insert(
"push_mixable");
85 if (find(mixables_.begin(), mixables_.end(), mixable) == mixables_.end()) {
86 mixables_.push_back(mixable);
91 const msgpack::object& o)
const {
92 if (o.type != msgpack::type::ARRAY ||
93 o.via.array.size != count_mixable<linear_mixable>(mixables_)) {
98 vector<diff_object> diffs;
99 for (
size_t i = 0; i < mixables_.size(); i++) {
108 return diff_object(
new internal_diff_object(diffs));
112 const msgpack::object& o,
114 if (o.type != msgpack::type::ARRAY ||
115 o.via.array.size != count_mixable<linear_mixable>(mixables_)) {
120 internal_diff_object* diff_obj =
121 dynamic_cast<internal_diff_object*
>(ptr.get());
127 if (mixables_.size() != diff_obj->diffs_.size()) {
132 for (
size_t i = 0; i < mixables_.size(); i++) {
138 mixable->
mix(o.via.array.ptr[i], diff_obj->diffs_[i]);
143 pk.pack_array(count_mixable<linear_mixable>(mixables_));
144 for (
size_t i = 0; i < mixables_.size(); i++) {
155 internal_diff_object* diff_obj =
156 dynamic_cast<internal_diff_object*
>(obj.get());
162 if (count_mixable<linear_mixable>(mixables_) != diff_obj->diffs_.size()) {
168 for (
size_t i = 0; i < mixables_.size(); i++) {
173 success = mixable->
put_diff(diff_obj->diffs_[i]) && success;
180 pk.pack_array(count_mixable<push_mixable>(mixables_));
181 for (
size_t i = 0; i < mixables_.size(); i++) {
192 const msgpack::object& arg,
194 if (arg.type != msgpack::type::ARRAY ||
195 arg.via.array.size != count_mixable<push_mixable>(mixables_)) {
200 pk.pack_array(count_mixable<push_mixable>(mixables_));
201 for (
size_t i = 0, obj_index = 0; i < mixables_.size(); i++) {
207 mixable->
pull(arg.via.array.ptr[obj_index], pk);
213 if (o.type != msgpack::type::ARRAY ||
214 o.via.array.size != count_mixable<push_mixable>(mixables_)) {
219 for (
size_t i = 0, obj_index = 0; i < mixables_.size(); i++) {
224 mixable->
push(o.via.array.ptr[obj_index]);
229 std::vector<storage::version>
231 std::vector<storage::version> ret;
232 for (
size_t i = 0; i < mixables_.size(); ++i) {
233 ret.push_back(mixables_[i]->get_version());
virtual void mix(const msgpack::object &obj, diff_object) const =0
virtual void get_argument(packer &) const =0
void get_diff(framework::packer &) const
void pull(const msgpack::object &arg, framework::packer &) const
jubatus::util::lang::shared_ptr< diff_object_raw > diff_object
void get_argument(framework::packer &) const
#define JUBATUS_EXCEPTION(e)
virtual bool put_diff(const diff_object &obj)=0
bool put_diff(const framework::diff_object &obj)
std::vector< storage::version > get_versions() const
void register_mixable(framework::mixable *mixable)
framework::diff_object convert_diff_object(const msgpack::object &) const
virtual diff_object convert_diff_object(const msgpack::object &) const =0
msgpack::packer< jubatus_packer > packer
void push(const msgpack::object &)
void mix(const msgpack::object &obj, framework::diff_object) const
std::vector< storage::version > get_versions() const
std::vector< mixable * > mixables_
virtual void push(const msgpack::object &)=0
std::set< std::string > mixables() const
void register_mixable(framework::mixable *mixable)
virtual void get_diff(packer &) const =0
virtual void pull(const msgpack::object &arg, packer &) const =0
vector< diff_object > diffs_