diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h')
-rw-r--r-- | contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h | 567 |
1 files changed, 567 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h b/contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h new file mode 100644 index 0000000000..fc9d57d55e --- /dev/null +++ b/contrib/libs/poco/Foundation/include/Poco/Dynamic/Struct.h @@ -0,0 +1,567 @@ +// +// Struct.h +// +// Library: Foundation +// Package: Dynamic +// Module: Struct +// +// Definition of the Struct class. +// +// Copyright (c) 2007, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_Struct_INCLUDED +#define Foundation_Struct_INCLUDED + + +#include "Poco/Foundation.h" +#include "Poco/Dynamic/Var.h" +#include "Poco/Dynamic/VarHolder.h" +#include "Poco/SharedPtr.h" +#include <map> +#include <set> + + +namespace Poco { +namespace Dynamic { + + +template <typename K> +class Struct + /// Struct allows to define a named collection of Var objects. +{ +public: + typedef typename std::map<K, Var> Data; + typedef typename std::set<K> NameSet; + typedef typename Data::iterator Iterator; + typedef typename Data::const_iterator ConstIterator; + typedef typename Struct<K>::Data::value_type ValueType; + typedef typename Struct<K>::Data::size_type SizeType; + typedef typename std::pair<typename Struct<K>::Iterator, bool> InsRetVal; + typedef typename Poco::SharedPtr<Struct<K> > Ptr; + + Struct(): _data() + /// Creates an empty Struct + { + } + + Struct(const Data& val): _data(val) + /// Creates the Struct from the given value. + { + } + + template <typename T> + Struct(const std::map<K, T>& val) + { + typedef typename std::map<K, T>::const_iterator MapConstIterator; + + MapConstIterator it = val.begin(); + MapConstIterator itEnd = val.end(); + for (; it != itEnd; ++it) _data.insert(ValueType(it->first, Var(it->second))); + } + + virtual ~Struct() + /// Destroys the Struct. + { + } + + inline Var& operator [] (const K& name) + /// Returns the Var with the given name, creates an entry if not found. + { + return _data[name]; + } + + const Var& operator [] (const K& name) const + /// Returns the Var with the given name, throws a + /// NotFoundException if the data member is not found. + { + ConstIterator it = find(name); + if (it == end()) throw NotFoundException(name); + return it->second; + } + + inline bool contains(const K& name) const + /// Returns true if the Struct contains a member with the given name + { + return find(name) != end(); + } + + inline Iterator find(const K& name) + /// Returns an iterator, pointing to the <name,Var> pair containing + /// the element, or it returns end() if the member was not found + { + return _data.find(name); + } + + inline ConstIterator find(const K& name) const + /// Returns a const iterator, pointing to the <name,Var> pair containing + /// the element, or it returns end() if the member was not found + { + return _data.find(name); + } + + inline Iterator end() + /// Returns the end iterator for the Struct + { + return _data.end(); + } + + inline ConstIterator end() const + /// Returns the end const iterator for the Struct + { + return _data.end(); + } + + inline Iterator begin() + /// Returns the begin iterator for the Struct + { + return _data.begin(); + } + + inline ConstIterator begin() const + /// Returns the begin const iterator for the Struct + { + return _data.begin(); + } + + template <typename T> + inline InsRetVal insert(const K& key, const T& value) + /// Inserts a <name, Var> pair into the Struct, + /// returns a pair containing the iterator and a boolean which + /// indicates success or not (is true, when insert succeeded, false, + /// when already another element was present, in this case Iterator + /// points to that other element) + { + // fix: SunPro C++ is silly ... + ValueType valueType(key, value); + return insert(valueType); + } + + inline InsRetVal insert(const ValueType& aPair) + /// Inserts a <name, Var> pair into the Struct, + /// returns a pair containing the iterator and a boolean which + /// indicates success or not (is true, when insert succeeded, false, + /// when already another element was present, in this case Iterator + /// points to that other element) + { + return _data.insert(aPair); + } + + inline SizeType erase(const K& key) + /// Erases the element if found, returns number of elements deleted + { + return _data.erase(key); + } + + inline void erase(Iterator& it) + /// Erases the element at the given position + { + _data.erase(it); + } + + inline bool empty() const + /// Returns true if the Struct doesn't contain any members + { + return _data.empty(); + } + + inline void clear() + /// Clears the Struct contents + { + _data.clear(); + } + + SizeType size() const + /// Returns the number of members the Struct contains + { + return _data.size(); + } + + inline NameSet members() const + /// Returns a sorted collection containing all member names + { + NameSet keys; + ConstIterator it = begin(); + ConstIterator itEnd = end(); + for (; it != itEnd; ++it) keys.insert(it->first); + return keys; + } + + std::string toString() + { + std::string str; + Var(*this).convert<std::string>(str); + return str; + } + +private: + Data _data; +}; + + +template <> +class VarHolderImpl<Struct<std::string> >: public VarHolder +{ +public: + VarHolderImpl(const Struct<std::string>& val): _val(val) + { + } + + ~VarHolderImpl() + { + } + + const std::type_info& type() const + { + return typeid(Struct<std::string>); + } + + void convert(Int8&) const + { + throw BadCastException("Cannot cast Struct type to Int8"); + } + + void convert(Int16&) const + { + throw BadCastException("Cannot cast Struct type to Int16"); + } + + void convert(Int32&) const + { + throw BadCastException("Cannot cast Struct type to Int32"); + } + + void convert(Int64&) const + { + throw BadCastException("Cannot cast Struct type to Int64"); + } + + void convert(UInt8&) const + { + throw BadCastException("Cannot cast Struct type to UInt8"); + } + + void convert(UInt16&) const + { + throw BadCastException("Cannot cast Struct type to UInt16"); + } + + void convert(UInt32&) const + { + throw BadCastException("Cannot cast Struct type to UInt32"); + } + + void convert(UInt64&) const + { + throw BadCastException("Cannot cast Struct type to UInt64"); + } + + void convert(bool&) const + { + throw BadCastException("Cannot cast Struct type to bool"); + } + + void convert(float&) const + { + throw BadCastException("Cannot cast Struct type to float"); + } + + void convert(double&) const + { + throw BadCastException("Cannot cast Struct type to double"); + } + + void convert(char&) const + { + throw BadCastException("Cannot cast Struct type to char"); + } + + void convert(std::string& val) const + { + val.append("{ "); + Struct<std::string>::ConstIterator it = _val.begin(); + Struct<std::string>::ConstIterator itEnd = _val.end(); + if (!_val.empty()) + { + Var key(it->first); + Impl::appendJSONKey(val, key); + val.append(" : "); + Impl::appendJSONValue(val, it->second); + ++it; + } + for (; it != itEnd; ++it) + { + val.append(", "); + Var key(it->first); + Impl::appendJSONKey(val, key); + val.append(" : "); + Impl::appendJSONValue(val, it->second); + } + val.append(" }"); + } + + void convert(Poco::DateTime&) const + { + throw BadCastException("Struct -> Poco::DateTime"); + } + + void convert(Poco::LocalDateTime&) const + { + throw BadCastException("Struct -> Poco::LocalDateTime"); + } + + void convert(Poco::Timestamp&) const + { + throw BadCastException("Struct -> Poco::Timestamp"); + } + + VarHolder* clone(Placeholder<VarHolder>* pVarHolder = 0) const + { + return cloneHolder(pVarHolder, _val); + } + + const Struct<std::string>& value() const + { + return _val; + } + + bool isArray() const + { + return false; + } + + bool isStruct() const + { + return true; + } + + bool isInteger() const + { + return false; + } + + bool isSigned() const + { + return false; + } + + bool isNumeric() const + { + return false; + } + + bool isString() const + { + return false; + } + + std::size_t size() const + { + return _val.size(); + } + + Var& operator [] (const std::string& name) + { + return _val[name]; + } + + const Var& operator [] (const std::string& name) const + { + return _val[name]; + } + +private: + Struct<std::string> _val; +}; + + +template <> +class VarHolderImpl<Struct<int> >: public VarHolder +{ +public: + VarHolderImpl(const Struct<int>& val): _val(val) + { + } + + ~VarHolderImpl() + { + } + + const std::type_info& type() const + { + return typeid(Struct<int>); + } + + void convert(Int8&) const + { + throw BadCastException("Cannot cast Struct type to Int8"); + } + + void convert(Int16&) const + { + throw BadCastException("Cannot cast Struct type to Int16"); + } + + void convert(Int32&) const + { + throw BadCastException("Cannot cast Struct type to Int32"); + } + + void convert(Int64&) const + { + throw BadCastException("Cannot cast Struct type to Int64"); + } + + void convert(UInt8&) const + { + throw BadCastException("Cannot cast Struct type to UInt8"); + } + + void convert(UInt16&) const + { + throw BadCastException("Cannot cast Struct type to UInt16"); + } + + void convert(UInt32&) const + { + throw BadCastException("Cannot cast Struct type to UInt32"); + } + + void convert(UInt64&) const + { + throw BadCastException("Cannot cast Struct type to UInt64"); + } + + void convert(bool&) const + { + throw BadCastException("Cannot cast Struct type to bool"); + } + + void convert(float&) const + { + throw BadCastException("Cannot cast Struct type to float"); + } + + void convert(double&) const + { + throw BadCastException("Cannot cast Struct type to double"); + } + + void convert(char&) const + { + throw BadCastException("Cannot cast Struct type to char"); + } + + void convert(std::string& val) const + { + val.append("{ "); + Struct<int>::ConstIterator it = _val.begin(); + Struct<int>::ConstIterator itEnd = _val.end(); + if (!_val.empty()) + { + Var key(it->first); + Impl::appendJSONKey(val, key); + val.append(" : "); + Impl::appendJSONValue(val, it->second); + ++it; + } + for (; it != itEnd; ++it) + { + val.append(", "); + Var key(it->first); + Impl::appendJSONKey(val, key); + val.append(" : "); + Impl::appendJSONValue(val, it->second); + } + val.append(" }"); + } + + void convert(Poco::DateTime&) const + { + throw BadCastException("Struct -> Poco::DateTime"); + } + + void convert(Poco::LocalDateTime&) const + { + throw BadCastException("Struct -> Poco::LocalDateTime"); + } + + void convert(Poco::Timestamp&) const + { + throw BadCastException("Struct -> Poco::Timestamp"); + } + + VarHolder* clone(Placeholder<VarHolder>* pVarHolder = 0) const + { + return cloneHolder(pVarHolder, _val); + } + + const Struct<int>& value() const + { + return _val; + } + + bool isArray() const + { + return false; + } + + bool isStruct() const + { + return true; + } + + bool isInteger() const + { + return false; + } + + bool isSigned() const + { + return false; + } + + bool isNumeric() const + { + return false; + } + + bool isString() const + { + return false; + } + + std::size_t size() const + { + return _val.size(); + } + + Var& operator [] (int name) + { + return _val[name]; + } + + const Var& operator [] (int name) const + { + return _val[name]; + } + +private: + Struct<int> _val; +}; + + +} // namespace Dynamic + + +typedef Dynamic::Struct<std::string> DynamicStruct; + + +} // namespace Poco + + +#endif // Foundation_Struct_INCLUDED |