// // DynamicAny.h // // $Id: //poco/Main/Foundation/include/Poco/DynamicAny.h#3 $ // // Library: Poco // Package: Core // Module: DynamicAny // // Definition of the DynamicAny class. // // Copyright (c) 2007, 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 Poco_DynamicAny_INCLUDED #define Poco_DynamicAny_INCLUDED #include "Poco/Poco.h" #include "Poco/DynamicAnyHolder.h" #include namespace Poco { class Foundation_API DynamicAny /// A DynamicAny allows to store data of different types and to convert between these types transparently. /// It's the reponsibility of the programmer to ensure that conversions are meaningful. /// For example: it is possible to convert between string and character. An empty string gets converted to /// the char '\0', a non-empty string gets truncated to the very first character. Numeric values are truncated, /// no overflow/underflow errors are checked. A string value "false" can be converted to a boolean value false, /// any other string not "false" (not case sensitive) or "0" to true (e.g: "hi" -> true). /// /// A DynamicAny can be created from a value of any type for which a /// specialization of DynamicAnyHolderImpl is available. { public: DynamicAny(); /// Creates a DynamicAny holding an int with value 0. template DynamicAny(const T &val): _pHolder(new DynamicAnyHolderImpl(val)) /// Creates the DynamicAny from the given value. { } DynamicAny(const char* pVal); // Convenience constructor for const char* which gets mapped to a std::string internally, i.e. pVal is deep-copied. DynamicAny(const DynamicAny& other); /// Copy constructor. ~DynamicAny(); /// Destroys the DynamicAny. void swap(DynamicAny& other); /// Swaps the content of the this DynamicAny with the other DynamicAny. template void convert(T& val) const /// Invoke this method to perform conversion. /// /// Example usage: /// DynamicAny any("42"); /// int i; /// any.convert(i); { _pHolder->convert(val); } template T convert() const /// Invoke this method to perform conversion. /// /// Example usage: /// DynamicAny any("42"); /// int i = any.convert(); { T result; _pHolder->convert(result); return result; } template operator T() const /// Conversion operator for implicit type /// conversions. { T result; _pHolder->convert(result); return result; } template DynamicAny& operator = (const T& other) /// Assignment operator { DynamicAny tmp(other); swap(tmp); return *this; } const std::type_info& type() const; /// Returns the type information of the stored content. private: DynamicAnyHolder* _pHolder; }; } // namespace Poco #endif // Poco_DynamicAny_INCLUDED