#include "stable.h" #include "Streamer.h" #include #include #include #include "ObjectInputStream.h" #include "ObjectOutputStream.h" #include "PresentsError.h" #include "streamers/StringStreamer.h" #include "streamers/StreamableStreamer.h" #include "streamers/VectorStreamer.h" #include "Util.h" class StreamerMap { private: typedef std::map Map; public: void insert (const utf8& javaName, Streamer* streamer) { _map[javaName] = streamer; } Streamer* get (const utf8& javaName) { Map::iterator it = _map.find(javaName); if (it == _map.end()) { throw PresentsError((boost::format("Unable to find Streamer for %1%") % javaName).str()); } return it->second; } ~StreamerMap () { for (Map::iterator iter = _map.begin(); iter != _map.end(); ++iter) { delete iter->second; } } private: Map _map; }; namespace { template void registerPrimitiveArrayStreamer (StreamerMap& map) { map.insert(getJavaName((const std::vector*)NULL), new VectorStreamer()); } template void registerObjectArrayStreamer (StreamerMap& map) { map.insert(getJavaName<>((std::vector< Shared >*)NULL), new VectorStreamer()); } } StreamerMap* getMap () { static bool gInited = false; static StreamerMap gMap; if (!gInited) { gInited = true; gMap.insert(getJavaName((utf8*)NULL), new StringStreamer()); gMap.insert(JAVA_LIST_NAME(), new VectorStreamer< Streamable >()); registerObjectArrayStreamer(gMap); registerObjectArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); registerPrimitiveArrayStreamer(gMap); } return &gMap; } void registerStreamer (const utf8& javaName, Streamer* streamer) { getMap()->insert(javaName, streamer); } Streamer* getStreamer (const utf8& javaName) { return getMap()->get(javaName); }