dynamic_msg_data(std::vector<uniform_value>&& data)
     : m_elements(std::move(data)),
       m_type_token(0xFFFFFFFF) {
   for (auto& e : m_elements) {
     add_to_type_token(e->ti->type_nr());
   }
 }
dynamic_message_data::dynamic_message_data(const dynamic_message_data& other)
    : detail::message_data(other),
      type_token_(0xFFFFFFFF) {
  for (auto& e : other.elements_) {
    add_to_type_token(e->type().first);
    elements_.emplace_back(e->copy());
  }
}
 dynamic_msg_data(const dynamic_msg_data& other)
     : detail::message_data(other),
       m_type_token(0xFFFFFFFF) {
   for (auto& e : other.m_elements) {
     add_to_type_token(e->ti->type_nr());
     m_elements.push_back(e->copy());
   }
 }
void concatenated_tuple::init() {
  m_type_token = make_type_token();
  for (auto& m : m_data) {
    for (size_t i = 0; i < m->size(); ++i) {
      m_type_token = add_to_type_token(m_type_token, m->type_nr_at(i));
    }
  }
  auto acc_size = [](size_t tmp, const cow_ptr& val) {
    return tmp + val->size();
  };
  m_size = std::accumulate(m_data.begin(), m_data.end(), size_t{0}, acc_size);
}
concatenated_tuple::concatenated_tuple(std::initializer_list<cow_ptr> xs) {
  for (auto& x : xs) {
    if (x) {
      auto dptr = dynamic_cast<const concatenated_tuple*>(x.get());
      if (dptr) {
        auto& vec = dptr->data_;
        data_.insert(data_.end(), vec.begin(), vec.end());
      } else {
        data_.push_back(std::move(x));
      }
    }
  }
  type_token_ = make_type_token();
  for (auto& m : data_) {
    for (size_t i = 0; i < m->size(); ++i) {
      type_token_ = add_to_type_token(type_token_, m->type_nr_at(i));
    }
  }
  auto acc_size = [](size_t tmp, const cow_ptr& val) {
    return tmp + val->size();
  };
  size_ = std::accumulate(data_.begin(), data_.end(), size_t{0}, acc_size);
}
dynamic_message_data::dynamic_message_data(elements&& data)
    : elements_(std::move(data)),
      type_token_(0xFFFFFFFF) {
  for (auto& e : elements_)
    add_to_type_token(e->type().first);
}
void dynamic_message_data::append(type_erased_value_ptr x) {
  add_to_type_token(x->type().first);
  elements_.emplace_back(std::move(x));
}
 void append(uniform_value&& what) {
   add_to_type_token(what->ti->type_nr());
   m_elements.push_back(std::move(what));
 }