#ifndef __JIO__JSTDIO__ #define __JIO__JSTDIO__ #include #include "JLang/JSTDTypes.hh" #include "JIO/JSerialisable.hh" /** * \file * STD extensions for binary I/O. * \author mdejong */ namespace JIO {} namespace JPP { using namespace JIO; } namespace JIO { /** * Read template std::string from input. * * \param in reader * \param object object * \return reader */ inline JReader& operator>>(JReader& in, std::string& object) { unsigned int n = 0; object.clear(); in.read((char*) &n, sizeof(unsigned int)); for (char c; n != 0; --n, object += c) { in.read(&c, sizeof(char)); } return in; } /** * Write template std::string to output. * * \param out writer * \param object object * \return writer */ inline JWriter& operator<<(JWriter& out, const std::string& object) { unsigned int n = object.size(); out.write((const char*) &n, sizeof(unsigned int)); out.write((const char*) object.c_str(), n); return out; } /** * Read template std::vector from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::vector& object) { int n = 0; in >> n; object.resize(n); for (typename std::vector::iterator i = object.begin(); i != object.end(); ++i) { in >> *i; } return in; } /** * Write template std::vector to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::vector& object) { int n = object.size(); out << n; for (typename std::vector::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } /** * Read template std::list from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::list& object) { int n = 0; in >> n; typename std::list::value_type element; object.clear(); for (int i = 0; i != n; ++i) { in >> element; object.push_back(element); } return in; } /** * Write template std::list to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::list& object) { int n = object.size(); out << n; for (typename std::list::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } /** * Read template std::set from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::set& object) { int n = 0; in >> n; typename std::set::value_type element; object.clear(); for (int i = 0; i != n; ++i) { in >> element; object.insert(element); } return in; } /** * Write template std::set to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::set& object) { int n = object.size(); out << n; for (typename std::set::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } /** * Read template std::multiset from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::multiset& object) { int n = 0; in >> n; typename std::multiset::value_type element; object.clear(); for (int i = 0; i != n; ++i) { in >> element; object.insert(element); } return in; } /** * Write template std::multiset to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::multiset& object) { int n = object.size(); out << n; for (typename std::multiset::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } /** * Read template std::pair from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::pair& object) { in >> object.first; in >> object.second; return in; } /** * Write template std::pair to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::pair& object) { out << object.first; out << object.second; return out; } /** * Read template std::map from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::map& object) { int n = 0; in >> n; typename std::map::key_type key; typename std::map::mapped_type value; object.clear(); for (int i = 0; i != n; ++i) { in >> key >> value; object[key]=value; } return in; } /** * Write template std::map to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::map& object) { int n = object.size(); out << n; for (typename std::map::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } /** * Read template std::multimap from input. * * \param in reader * \param object object * \return reader */ template inline JReader& operator>>(JReader& in, std::multimap& object) { int n = 0; in >> n; typename std::multimap::key_type key; typename std::multimap::mapped_type value; object.clear(); for (int i = 0; i != n; ++i) { in >> key >> value; object[key]=value; } return in; } /** * Write template std::multimap to output. * * \param out writer * \param object object * \return writer */ template inline JWriter& operator<<(JWriter& out, const std::multimap& object) { int n = object.size(); out << n; for (typename std::multimap::const_iterator i = object.begin(); i != object.end(); ++i) { out << *i; } return out; } } #endif