template<typename IStream, typename OStream>
void session<IStream, OStream>::pack_any(const boost::any& value)
{
if (value.empty()) {
m_packer.pack_nil();
} else if (value.type() == typeid(anyvec)) {
anyvec v = boost::any_cast<anyvec>(value);
m_packer.pack_array(v.size());
anyvec::iterator it = v.begin();
while (it != v.end()) {
pack_any(*it);
++it;
}
} else if (value.type() == typeid(anymap)) {
anymap m = boost::any_cast<anymap>(value);
m_packer.pack_map(m.size());
anymap::iterator it = m.begin();
while (it != m.end()) {
m_packer.pack(it->first); // std::string
pack_any(it->second);
++it;
}
} else if (value.type() == typeid(int)) {
int val = boost::any_cast<int>(value);
m_packer.pack(val);
} else if (value.type() == typeid(uint64_t)) {
uint64_t val = boost::any_cast<uint64_t>(value);
m_packer.pack(val);
} else if (value.type() == typeid(bool)) {
bool val = boost::any_cast<bool>(value);
m_packer.pack(val);
} else if (value.type() == typeid(float)) {
float val = boost::any_cast<float>(value);
m_packer.pack(val);
} else if (value.type() == typeid(double)) {
double val = boost::any_cast<double>(value);
m_packer.pack(val);
} else if (value.type() == typeid(std::string)) {
std::string val = boost::any_cast<std::string>(value);
m_packer.pack(val);
} else {
// TODO: Revisit this as I suspect that we should be asserting
// here or throwing some kind of exception.
std::cerr << "Warning: don't know how to pack type " << value.type().name() << std::endl;
}
}