#pragma once #include "../Streamer.h" #include "presents/ArrayMask.h" template class VectorStreamer : public Streamer { public: Shared createObject (ObjectInputStream& in); void writeObject (const Shared& object, ObjectOutputStream& out); }; template Shared VectorStreamer::createObject (ObjectInputStream& in) { int length = in.readInt(); Shared< std::vector< Shared > > v(new std::vector< Shared >(length)); for (int ii = 0; ii < length; ++ii) { Shared read = in.readObject(); (*v)[ii] = boost::static_pointer_cast(read); } return v; } template void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { Shared< std::vector< Shared > >& v = (Shared< std::vector< Shared > >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeObject((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readByte(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeByte((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readShort(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeShort((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readInt(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeInt((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readLong(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeLong((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readFloat(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeFloat((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readDouble(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeDouble((*v)[ii]); } } template <> Shared VectorStreamer::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector > v(new std::vector(length)); for (int ii = 0; ii < length; ++ii) { (*v)[ii] = in.readBoolean(); } return v; } template <> void VectorStreamer::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector >& v = (Shared< std::vector >&)(object); int length = v->size(); out.writeInt(length); for (int ii = 0; ii < length; ++ii) { out.writeBoolean((*v)[ii]); } } template <> Shared VectorStreamer< utf8 >::createObject (ObjectInputStream& in) { int32 length = in.readInt(); Shared< std::vector< Shared > > v(new std::vector< Shared >(length)); ArrayMask mask(in); for (int ii = 0; ii < length; ++ii) { if (mask.isSet(ii)) { (*v)[ii] = Shared(new utf8(in.readUTF())); } else { (*v)[ii] = Shared(); } } return v; } template <> void VectorStreamer< utf8 >::writeObject (const Shared& object, ObjectOutputStream& out) { const Shared< std::vector< Shared > >& v = (Shared< std::vector< Shared > >&)(object); int length = v->size(); out.writeInt(length); ArrayMask mask(length); for (int ii = 0; ii < length; ++ii) { if ((*v)[ii] != NULL) { mask.set(ii); } } mask.writeTo(out); for (int ii = 0; ii < length; ++ii) { out.writeUTF(*((*v)[ii])); } }