// file : xsd/cxx/tree/stream-extraction-map.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_CXX_TREE_STREAM_EXTRACTION_MAP_HXX #define XSD_CXX_TREE_STREAM_EXTRACTION_MAP_HXX #include #include // std::auto_ptr/unique_ptr #include // std::size_t #include // XSD_AUTO_PTR #include #include #include namespace xsd { namespace cxx { namespace tree { template struct stream_extraction_map { typedef xml::qualified_name qualified_name; typedef XSD_AUTO_PTR (*extractor) ( istream&, flags, container*); public: stream_extraction_map (); void register_type (const qualified_name& name, extractor, bool replace = true); void unregister_type (const qualified_name& name); XSD_AUTO_PTR extract (istream&, flags, container*); public: extractor find (const qualified_name& name) const; private: typedef std::map type_map; type_map type_map_; }; // // template struct stream_extraction_plate { static stream_extraction_map* map; static std::size_t count; stream_extraction_plate (); ~stream_extraction_plate (); }; template stream_extraction_map* stream_extraction_plate::map = 0; template std::size_t stream_extraction_plate::count = 0; // // template inline stream_extraction_map& stream_extraction_map_instance () { return *stream_extraction_plate::map; } // // template XSD_AUTO_PTR extractor_impl (istream&, flags, container*); template struct stream_extraction_initializer { stream_extraction_initializer (const C* name, const C* ns); ~stream_extraction_initializer (); private: const C* name_; const C* ns_; }; } } } #include #endif // XSD_CXX_TREE_STREAM_EXTRACTION_MAP_HXX