void madara::knowledge::containers::NativeDoubleVector::transfer_to ( NativeDoubleVector & other) { if (context_ && other.context_) { ContextGuard context_guard (*context_); ContextGuard other_context_guard (*other.context_); MADARA_GUARD_TYPE guard (mutex_); MADARA_GUARD_TYPE guard2 (other.mutex_); madara_logger_ptr_log (logger::global_logger.get (), logger::LOG_MAJOR, "NativeDoubleVector::transfer_to: %s transfering to %s\n", this->name_.c_str (), other.name_.c_str ()); size_t other_size = other.size (); size_t this_size = this->size (); if (this_size > 0) { madara_logger_ptr_log (logger::global_logger.get (), logger::LOG_MINOR, "NativeDoubleVector::transfer_to: %s has elements\n", this->name_.c_str ()); size_t size = other_size + this_size; other.resize ((int)size); knowledge::KnowledgeRecord rhs (other.context_->get (other.vector_)); knowledge::KnowledgeRecord lhs (context_->get (vector_)); rhs.set_index (size - 1, lhs.retrieve_index (this_size - 1).to_double ()); for (size_t i = 0, j = other_size; i < this_size - 1; ++i, ++j) { rhs.set_index (other_size, lhs.retrieve_index (i).to_double ()); } other.context_->set (other.vector_, rhs, other.settings_); this->resize (0); } } }
void madara::knowledge::containers::FlexMap::exchange( FlexMap& other, bool refresh_keys, bool delete_keys) { if (context_ && other.context_) { std::lock(*context_, *other.context_, mutex_, other.mutex_); ContextGuard context_guard(*context_, std::adopt_lock); ContextGuard other_context_guard(*other.context_, std::adopt_lock); MADARA_GUARD_TYPE guard(mutex_, std::adopt_lock), guard2(other.mutex_, std::adopt_lock); // use the Map container, which already has exchange implemented KnowledgeBase knowledge; knowledge.facade_for(*context_); Map this_map(name_, knowledge, settings_, delimiter_); Map other_map(other.name_, knowledge, other.settings_, delimiter_); this_map.exchange(other_map, refresh_keys, delete_keys); } }
void madara::knowledge::containers::NativeDoubleVector::exchange ( NativeDoubleVector & other) { if (context_ && other.context_) { ContextGuard context_guard (*context_); ContextGuard other_context_guard (*other.context_); MADARA_GUARD_TYPE guard (mutex_), guard2 (other.mutex_); madara_logger_ptr_log (logger::global_logger.get (), logger::LOG_MAJOR, "NativeDoubleVector::exchange: %s exchanging with %s\n", this->name_.c_str (), other.name_.c_str ()); knowledge::KnowledgeRecord temp (context_->get (other.vector_)); context_->set (other.vector_, context_->get (vector_), other.settings_); context_->set (vector_, temp, settings_); } }
void madara::knowledge::containers::IntegerVector::transfer_to (IntegerVector & other) { if (context_ && other.context_) { ContextGuard context_guard (*context_); ContextGuard other_context_guard (*other.context_); MADARA_GUARD_TYPE guard (mutex_); MADARA_GUARD_TYPE guard2 (other.mutex_); size_t other_size = other.vector_.size (); size_t this_size = this->vector_.size (); size_t size = other_size + this_size; other.resize ((int)size); for (size_t i = 0, j = other_size; i < this_size; ++i, ++j) { other.context_->set (other.vector_[j], (*this)[i], other.settings_); } this->resize (0, true); } }
void madara::knowledge::containers::IntegerVector::exchange ( IntegerVector & other, bool refresh_keys, bool delete_keys) { if (context_ && other.context_) { ContextGuard context_guard (*context_); ContextGuard other_context_guard (*other.context_); MADARA_GUARD_TYPE guard (mutex_), guard2 (other.mutex_); if (refresh_keys) { other.resize (); this->resize (); } size_t other_size = other.vector_.size (); size_t this_size = this->vector_.size (); for (size_t i = 0; i < this_size; ++i) { // temp = this[i]; knowledge::KnowledgeRecord temp = context_->get (this->vector_[i], settings_); if (i < other_size) { // this[i] = other[i]; context_->set (this->vector_[i], context_->get (other.vector_[i], other.settings_), settings_); // other[i] = temp; other.context_->set (other.vector_[i], temp, other.settings_); } else { if (delete_keys) { std::stringstream buffer; buffer << this->name_; buffer << delimiter_; buffer << i; this->context_->delete_variable (buffer.str (), other.settings_); } else { knowledge::KnowledgeRecord zero; this->context_->set (this->vector_[i], zero, this->settings_); } { std::stringstream buffer; buffer << other.name_; buffer << delimiter_; buffer << i; // other[i] = temp; other.context_->set (buffer.str (), temp, other.settings_); } } } // copy the other vector's elements to this vector's location for (size_t i = this_size; i < other_size; ++i) { std::stringstream buffer; buffer << this->name_; buffer << delimiter_; buffer << i; context_->set (buffer.str (), other.context_->get (other.vector_[i], other.settings_), this->settings_); } // set the size appropriately this->context_->set (this->size_, knowledge::KnowledgeRecord::Integer (other_size), this->settings_); other.context_->set (other.size_, knowledge::KnowledgeRecord::Integer (this_size), other.settings_); if (refresh_keys) { this->resize (-1, true); other.resize (-1, true); } } }