// // Manifest.h // // $Id: //poco/Main/Foundation/include/Poco/Manifest.h#2 $ // // Library: Foundation // Package: SharedLibrary // Module: ClassLoader // // Definition of the Manifest class. // // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // Permission is hereby granted, free of charge, to any person or organization // obtaining a copy of the software and accompanying documentation covered by // this license (the "Software") to use, reproduce, display, distribute, // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: // // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #ifndef Foundation_Manifest_INCLUDED #define Foundation_Manifest_INCLUDED #include "Poco/Foundation.h" #include "Poco/MetaObject.h" #include #include namespace Poco { class Foundation_API ManifestBase /// ManifestBase is a common base class for /// all instantiations of Manifest. { public: ManifestBase(); virtual ~ManifestBase(); virtual const char* className() const = 0; /// Returns the type name of the manifest's class. }; template class Manifest: public ManifestBase /// A Manifest maintains a list of all classes /// contained in a dynamically loadable class /// library. /// Internally, the information is held /// in a map. An iterator is provided to /// iterate over all the classes in a Manifest. { public: typedef AbstractMetaObject Meta; typedef std::map MetaMap; class Iterator /// The Manifest's very own iterator class. { public: Iterator(const typename MetaMap::const_iterator& it) { _it = it; } Iterator(const Iterator& it) { _it = it._it; } ~Iterator() { } Iterator& operator = (const Iterator& it) { _it = it._it; return *this; } inline bool operator == (const Iterator& it) const { return _it == it._it; } inline bool operator != (const Iterator& it) const { return _it != it._it; } Iterator& operator ++ () // prefix { ++_it; return *this; } Iterator operator ++ (int) // postfix { Iterator result(_it); ++_it; return result; } inline const Meta* operator * () const { return _it->second; } inline const Meta* operator -> () const { return _it->second; } private: typename MetaMap::const_iterator _it; }; Manifest() /// Creates an empty Manifest. { } virtual ~Manifest() /// Destroys the Manifest. { clear(); } Iterator find(const std::string& className) const /// Returns an iterator pointing to the MetaObject /// for the given class. If the MetaObject cannot /// be found, the iterator points to end(). { return Iterator(_metaMap.find(className)); } Iterator begin() const { return Iterator(_metaMap.begin()); } Iterator end() const { return Iterator(_metaMap.end()); } bool insert(const Meta* pMeta) /// Inserts a MetaObject. Returns true if insertion /// was successful, false if a class with the same /// name already exists. { return _metaMap.insert(typename MetaMap::value_type(pMeta->name(), pMeta)).second; } void clear() /// Removes all MetaObjects from the manifest. { for (typename MetaMap::iterator it = _metaMap.begin(); it != _metaMap.end(); ++it) { delete it->second; } _metaMap.clear(); } int size() const /// Returns the number of MetaObjects in the Manifest. { return int(_metaMap.size()); } bool empty() const /// Returns true iff the Manifest does not contain any MetaObjects. { return _metaMap.empty(); } const char* className() const { return typeid(*this).name(); } private: MetaMap _metaMap; }; } // namespace Poco #endif // Foundation_Manifest_INCLUDED