// // Pair.h // // Library: Foundation // Package: Dynamic // Module: Pair // // Definition of the Pair class. // // Copyright (c) 2007, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #ifndef Foundation_Pair_INCLUDED #define Foundation_Pair_INCLUDED #include "Poco/Foundation.h" #include "Poco/Dynamic/Var.h" #include "Poco/Dynamic/VarHolder.h" #include namespace Poco { namespace Dynamic { template class Pair /// Pair allows to define a pair of values. { public: using Data = typename std::pair; Pair(): _data() /// Creates an empty Pair { } Pair(const Pair& other): _data(other._data) /// Creates the Pair from another pair. { } Pair(const Data& val): _data(val) /// Creates the Pair from the given value. { } template Pair(const std::pair& val): _data(std::make_pair(val.first, val.second)) /// Creates Pair form standard pair. { } template Pair(const K& first, const T& second): _data(std::make_pair(first, second)) /// Creates pair from two values. { } virtual ~Pair() /// Destroys the Pair. { } Pair& swap(Pair& other) /// Swaps the content of the two Pairs. { std::swap(_data, other._data); return *this; } Pair& operator = (const Pair& other) /// Copy constructs Pair from another pair. { Pair(other).swap(*this); return *this; } inline const K& first() const /// Returns the first member of the pair. { return _data.first; } inline const Var& second() const /// Returns the second member of the pair. { return _data.second; } std::string toString() { std::string str; Var(*this).template convert(str); return str; } private: Data _data; }; template <> class VarHolderImpl>: public VarHolder { public: VarHolderImpl(const Pair& val): _val(val) { } ~VarHolderImpl() { } const std::type_info& type() const { return typeid(Pair); } void convert(Int8& val) const { throw BadCastException("Cannot cast Pair type to Int8"); } void convert(Int16& val) const { throw BadCastException("Cannot cast Pair type to Int16"); } void convert(Int32& val) const { throw BadCastException("Cannot cast Pair type to Int32"); } void convert(Int64& val) const { throw BadCastException("Cannot cast Pair type to Int64"); } void convert(UInt8& val) const { throw BadCastException("Cannot cast Pair type to UInt8"); } void convert(UInt16& val) const { throw BadCastException("Cannot cast Pair type to UInt16"); } void convert(UInt32& val) const { throw BadCastException("Cannot cast Pair type to UInt32"); } void convert(UInt64& val) const { throw BadCastException("Cannot cast Pair type to UInt64"); } void convert(bool& val) const { throw BadCastException("Cannot cast Pair type to bool"); } void convert(float& val) const { throw BadCastException("Cannot cast Pair type to float"); } void convert(double& val) const { throw BadCastException("Cannot cast Pair type to double"); } void convert(char& val) const { throw BadCastException("Cannot cast Pair type to char"); } void convert(std::string& val) const { // Serialize in JSON format: equals an object // JSON format definition: { string ':' value } string:value pair n-times, sep. by ',' val.append("{ "); Var key(_val.first()); Impl::appendJSONKey(val, key); val.append(" : "); Impl::appendJSONValue(val, _val.second()); val.append(" }"); } void convert(Poco::DateTime&) const { throw BadCastException("Pair -> Poco::DateTime"); } void convert(Poco::LocalDateTime&) const { throw BadCastException("Pair -> Poco::LocalDateTime"); } void convert(Poco::Timestamp&) const { throw BadCastException("Pair -> Poco::Timestamp"); } VarHolder* clone(Placeholder* pVarHolder = 0) const { return cloneHolder(pVarHolder, _val); } const Pair& value() const { return _val; } bool isArray() const { return false; } bool isStruct() const { return false; } bool isInteger() const { return false; } bool isSigned() const { return false; } bool isNumeric() const { return false; } bool isString() const { return false; } private: Pair _val; }; template <> class VarHolderImpl>: public VarHolder { public: VarHolderImpl(const Pair& val): _val(val) { } ~VarHolderImpl() { } const std::type_info& type() const { return typeid(Pair); } void convert(Int8& val) const { throw BadCastException("Cannot cast Pair type to Int8"); } void convert(Int16& val) const { throw BadCastException("Cannot cast Pair type to Int16"); } void convert(Int32& val) const { throw BadCastException("Cannot cast Pair type to Int32"); } void convert(Int64& val) const { throw BadCastException("Cannot cast Pair type to Int64"); } void convert(UInt8& val) const { throw BadCastException("Cannot cast Pair type to UInt8"); } void convert(UInt16& val) const { throw BadCastException("Cannot cast Pair type to UInt16"); } void convert(UInt32& val) const { throw BadCastException("Cannot cast Pair type to UInt32"); } void convert(UInt64& val) const { throw BadCastException("Cannot cast Pair type to UInt64"); } void convert(bool& val) const { throw BadCastException("Cannot cast Pair type to bool"); } void convert(float& val) const { throw BadCastException("Cannot cast Pair type to float"); } void convert(double& val) const { throw BadCastException("Cannot cast Pair type to double"); } void convert(char& val) const { throw BadCastException("Cannot cast Pair type to char"); } void convert(std::string& val) const { // Serialize in JSON format: equals an object // JSON format definition: { string ':' value } string:value pair n-times, sep. by ',' val.append("{ "); Var key(_val.first()); Impl::appendJSONKey(val, key); val.append(" : "); Impl::appendJSONValue(val, _val.second()); val.append(" }"); } void convert(Poco::DateTime&) const { throw BadCastException("Pair -> Poco::DateTime"); } void convert(Poco::LocalDateTime&) const { throw BadCastException("Pair -> Poco::LocalDateTime"); } void convert(Poco::Timestamp&) const { throw BadCastException("Pair -> Poco::Timestamp"); } VarHolder* clone(Placeholder* pVarHolder = 0) const { return cloneHolder(pVarHolder, _val); } const Pair& value() const { return _val; } bool isArray() const { return false; } bool isStruct() const { return false; } bool isInteger() const { return false; } bool isSigned() const { return false; } bool isNumeric() const { return false; } bool isString() const { return false; } private: Pair _val; }; } // namespace Dynamic } // namespace Poco #endif // Foundation_Pair_INCLUDED