X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fresource-encapsulation%2Finclude%2FRCSResourceAttributes.h;h=99d29bf5da62665ec1fca2d0ba72716332549e35;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=670f77b667c225f888a2352a9de3acee561ae407;hpb=6848338aebbe9c639e4e2bb01065e5ccff34092b;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/resource-encapsulation/include/RCSResourceAttributes.h b/service/resource-encapsulation/include/RCSResourceAttributes.h index 670f77b..99d29bf 100644 --- a/service/resource-encapsulation/include/RCSResourceAttributes.h +++ b/service/resource-encapsulation/include/RCSResourceAttributes.h @@ -21,7 +21,7 @@ /** * @file * - * This file contains the "RCSResourceAttributes" class & its helper classes + * This file contains the declaration of classes and its members related to RCSResourceAttributes */ #ifndef RES_ENCAPSULATION_RESOURCEATTRIBUTES_H #define RES_ENCAPSULATION_RESOURCEATTRIBUTES_H @@ -36,32 +36,187 @@ #include #include -#include -#include -#include -#include -#include -#include +#include "boost/variant.hpp" +#include "boost/mpl/contains.hpp" +#include "boost/mpl/find.hpp" +#include "boost/mpl/distance.hpp" +#include "boost/mpl/begin_end.hpp" +#include "boost/scoped_ptr.hpp" -#include +#include "RCSException.h" namespace OIC { namespace Service { + /** + * This RCSByteString the one of RCSResourceAttributes value for Byte String (Binary). + * + * It provides similar usage to c++ standard vector.
+ * An RCSByteString can be one of various attribute value type. + * + * @see Value + * @see Type + * @see RCSRemoteResourceObject + * @see RCSResourceObject + * @see RCSResourceAttributes + */ + class RCSByteString + { + public: + typedef std::vector DataType; + + /** + * Returns a vector type of byte string. + * + * @return A stored byte string with std::vector + */ + DataType getByteString() const + { + return {m_data}; + } + + /** + * Returns a size of stored vector. + * + * @return A size of stored byte string. + */ + size_t size() const + { + return m_data.size(); + } + + /** + * @relates RCSByteString + * + * Checks if the byte string is same contents, or not. + * + * @return true if the byte string are equal, false otherwise. + */ + inline bool operator==(const RCSByteString& rhs) const + { + return this->m_data == rhs.getByteString(); + } + + /** + * @relates RCSByteString + * + * Checks if the byte string is not same contents, or is same. + * + * @return true if the byte string are not equal, false otherwise. + */ + inline bool operator!=(const RCSByteString& rhs) const + { + return this->m_data != rhs.getByteString(); + } + + /** + * Return a value of indexed byte string. + * + * @param it location of the element. + * + * @return A copied value of indexed byte string. + */ + inline uint8_t operator[](size_t it) const + { + return this->m_data[it]; + } + + RCSByteString() + { + } + RCSByteString(DataType && rhs) + : m_data {std::move(rhs)} + { + } + RCSByteString(const DataType & rhs) + : m_data {rhs} + { + } + RCSByteString(RCSByteString && rhs) + : m_data {DataType{rhs.getByteString()}} + { + } + RCSByteString(const RCSByteString & rhs) + : m_data {DataType{rhs.getByteString()}} + { + } + + RCSByteString(::OCByteString && rhs) + : m_data {DataType{rhs.bytes, rhs.bytes + rhs.len}} + { + } + RCSByteString(const ::OCByteString & rhs) + : m_data {DataType{rhs.bytes, rhs.bytes + rhs.len}} + { + } + + RCSByteString(uint8_t* bytes, size_t size) + : m_data {DataType{bytes, bytes + size}} + { + } + inline RCSByteString& operator=(RCSByteString&& rhs) + { + return operator =(rhs); + } + inline RCSByteString& operator=(const RCSByteString& rhs) + { + if (!m_data.empty()) + { + m_data.clear(); + } + m_data = DataType{rhs.getByteString()}; + return *this; + } + private: + DataType m_data; + }; + +#ifdef __APPLE__ + class RCSResourceAttributes; + typedef boost::variant< + std::nullptr_t, + int, + double, + bool, + std::string, + RCSByteString, + RCSResourceAttributes, + + std::vector< int >, + std::vector< double >, + std::vector< bool >, + std::vector< std::string >, + std::vector< RCSByteString >, + std::vector< RCSResourceAttributes >, + + std::vector< std::vector< int > >, + std::vector< std::vector< std::vector< int > > >, + + std::vector< std::vector< double > >, + std::vector< std::vector< std::vector< double > > >, + + std::vector< std::vector< bool > >, + std::vector< std::vector< std::vector< bool > > >, + + std::vector< std::vector< std::string > >, + std::vector< std::vector< std::vector< std::string > > >, + + std::vector< std::vector< RCSByteString > >, + std::vector< std::vector< std::vector< RCSByteString > > >, + + std::vector< std::vector< RCSResourceAttributes > >, + std::vector< std::vector< std::vector< RCSResourceAttributes > > > + > ValueVariant; +#endif /** - * RCSResourceAttributes represents the attributes for a resource. + * This represents the attributes for a resource. * * It provides similar usage to c++ standard containers. (iterator, * operators and accessors)
* An attribute value can be one of various types.
* - * @note If client developer wants to get the RCSResourceAttributes for the resource of - * interest following are the steps: - * - first call the discover API of DiscoveryManager class. - * - After getting the RemoteResourceObject, call getRemoteAttributes() API - * of RemoteResourceObject class * * @see Value * @see Type @@ -70,24 +225,27 @@ namespace OIC * @see RCSDiscoveryManager * @see RCSRemoteResourceObject * @see RCSResourceObject + * @see RCSByteString */ class RCSResourceAttributes { private: template< typename T > struct IsSupportedTypeHelper; - +#ifndef __APPLE__ typedef boost::variant< std::nullptr_t, int, double, bool, std::string, + RCSByteString, RCSResourceAttributes, std::vector< int >, std::vector< double >, std::vector< bool >, std::vector< std::string >, + std::vector< RCSByteString >, std::vector< RCSResourceAttributes >, std::vector< std::vector< int > >, @@ -102,10 +260,13 @@ namespace OIC std::vector< std::vector< std::string > >, std::vector< std::vector< std::vector< std::string > > >, + std::vector< std::vector< RCSByteString > >, + std::vector< std::vector< std::vector< RCSByteString > > >, + std::vector< std::vector< RCSResourceAttributes > >, std::vector< std::vector< std::vector< RCSResourceAttributes > > > > ValueVariant; - +#endif template< typename T, typename V = void, typename = typename std::enable_if< IsSupportedTypeHelper< T >::type::value, V >::type > @@ -114,21 +275,29 @@ namespace OIC typedef V type; }; - template< typename VISITOR > + template< typename VISITOR, typename MOVE = std::false_type > class KeyValueVisitorHelper: public boost::static_visitor< > { public: - KeyValueVisitorHelper(VISITOR& visitor) noexcept : + KeyValueVisitorHelper(VISITOR& visitor) BOOST_NOEXCEPT : m_visitor( visitor ) { } - template< typename T > - void operator()(const std::string& key, const T& value) const + template< typename T, typename M = MOVE > + typename std::enable_if< std::is_same< M, std::false_type >::value >::type + operator()(const std::string& key, const T& value) const { m_visitor(key, value); } + template< typename T, typename M = MOVE > + typename std::enable_if< std::is_same< M, std::true_type >::value >::type + operator()(const std::string& key, T& value) + { + m_visitor(key, std::move(value)); + } + private: VISITOR& m_visitor; }; @@ -156,6 +325,7 @@ namespace OIC DOUBLE, /**< double */ BOOL, /**< bool */ STRING, /**< std::string */ + BYTESTRING, /**< RCSByteString */ ATTRIBUTES, /**< RCSResourceAttributes */ VECTOR /**< std::vector */ }; @@ -183,7 +353,7 @@ namespace OIC * * @see getBaseTypeId */ - TypeId getId() const noexcept; + TypeId getId() const BOOST_NOEXCEPT; /** * Returns the type identifier of a base type of sequence. @@ -195,7 +365,7 @@ namespace OIC * @see getDepth * @see getId */ - static TypeId getBaseTypeId(const Type& t) noexcept; + static TypeId getBaseTypeId(const Type& t) BOOST_NOEXCEPT; /** * Returns the depth of a type. @@ -204,7 +374,7 @@ namespace OIC * * @see getBaseTypeId */ - static size_t getDepth(const Type& t) noexcept; + static size_t getDepth(const Type& t) BOOST_NOEXCEPT; /** * Factory method to create Type instance from T. @@ -216,7 +386,7 @@ namespace OIC * @see is_supported_type */ template < typename T > - constexpr static Type typeOf(const T&) noexcept + constexpr static Type typeOf(const T&) BOOST_NOEXCEPT { return Type{ IndexOfType< T >::value }; } @@ -231,17 +401,17 @@ namespace OIC * @see is_supported_type */ template < typename T > - constexpr static Type typeOf() noexcept + constexpr static Type typeOf() BOOST_NOEXCEPT { return Type{ IndexOfType< T >::value }; } //! @cond - friend bool operator==(const Type&, const Type&) noexcept; + friend bool operator==(const Type&, const Type&) BOOST_NOEXCEPT; //! @endcond private: - constexpr explicit Type(int which) noexcept : + constexpr explicit Type(int which) BOOST_NOEXCEPT : m_which{ which } { } @@ -255,6 +425,41 @@ namespace OIC * * Type helps identify type information of Value. * + * Supported types are below + * @code + int + double + bool + std::string + RCSByteString + RCSResourceAttributes + + std::vector< int > + std::vector< double > + std::vector< bool > + std::vector< std::string > + std::vector< RCSByteString > + std::vector< RCSResourceAttributes > + + std::vector< std::vector< int > > + std::vector< std::vector< std::vector< int > > > + + std::vector< std::vector< double > > + std::vector< std::vector< std::vector< double > > > + + std::vector< std::vector< bool > > + std::vector< std::vector< std::vector< bool > > > + + std::vector< std::vector< std::string > > + std::vector< std::vector< std::vector< std::string > > > + + std::vector< std::vector< RCSByteString > > + std::vector< std::vector< std::vector< RCSByteString > > > + + std::vector< std::vector< RCSResourceAttributes > > + std::vector< std::vector< std::vector< RCSResourceAttributes > > > + * @endcode + * * @see RCSResourceAttributes * @see Type * @see is_supported_type @@ -266,7 +471,7 @@ namespace OIC Value(); Value(const Value&); - Value(Value&&) noexcept; + Value(Value&&) BOOST_NOEXCEPT; /** * Constructs a Value if T is a supported type.
@@ -335,7 +540,7 @@ namespace OIC /** * Exchanges the content of the object by the content of the parameter. */ - void swap(Value&) noexcept; + void swap(Value&) BOOST_NOEXCEPT; //! @cond friend class RCSResourceAttributes; @@ -347,11 +552,18 @@ namespace OIC { try { - return boost::get< T >(*m_data); + if ((*m_data).type() == typeid(T)) + { + return boost::get< T >(*m_data); + } + else + { + throw RCSBadGetException{ "Wrong type" }; + } } catch (const boost::bad_get&) { - throw BadGetException{ "Wrong type" }; + throw RCSBadGetException{ "Wrong type" }; } } @@ -362,13 +574,17 @@ namespace OIC { return get< T >() == rhs; } - catch (const BadGetException&) + catch (const RCSBadGetException&) { return false; } } +#ifdef __APPLE__ + public: +#else private: +#endif boost::scoped_ptr< ValueVariant > m_data; }; @@ -387,32 +603,32 @@ namespace OIC /** * Returns an {@link iterator} referring to the first element. */ - iterator begin() noexcept; + iterator begin() BOOST_NOEXCEPT; /** * Returns an {@link iterator} referring to the past-the-end element. */ - iterator end() noexcept; + iterator end() BOOST_NOEXCEPT; /** * @copydoc cbegin() */ - const_iterator begin() const noexcept; + const_iterator begin() const BOOST_NOEXCEPT; /** * @copydoc cend() */ - const_iterator end() const noexcept; + const_iterator end() const BOOST_NOEXCEPT; /** * Returns a const_iterator referring to the first element. */ - const_iterator cbegin() const noexcept; + const_iterator cbegin() const BOOST_NOEXCEPT; /** * Returns a const_iterator referring to the past-the-end element. */ - const_iterator cend() const noexcept; + const_iterator cend() const BOOST_NOEXCEPT; /** * Accesses a value. @@ -486,7 +702,7 @@ namespace OIC /** * Removes all elements. */ - void clear() noexcept; + void clear() BOOST_NOEXCEPT; /** * Removes a single element. @@ -498,7 +714,16 @@ namespace OIC bool erase(const std::string& key); /** - * Checks the container has an element with a Key equivalent to key. + * Removes a single element. + * + * @param pos Iterator to the element to remove. + * + * @return Iterator following the last removed element. + */ + iterator erase(const_iterator pos); + + /** + * Checks this contains an element for the specified key. * * @param key Key to check. * @@ -511,14 +736,14 @@ namespace OIC * * @see size */ - bool empty() const noexcept; + bool empty() const BOOST_NOEXCEPT; /** * Returns the number of elements. * * @see empty */ - size_t size() const noexcept; + size_t size() const BOOST_NOEXCEPT; private: template< typename VISITOR > @@ -533,7 +758,22 @@ namespace OIC } } + template< typename VISITOR > + void visitToMove(VISITOR& visitor) + { + KeyValueVisitorHelper< VISITOR, std::true_type > helper{ visitor }; + + for (auto& i : m_values) + { + boost::variant< const std::string& > key{ i.first }; + boost::apply_visitor(helper, key, *i.second.m_data); + } + } +#ifdef __APPLE__ + public: +#else private: +#endif std::unordered_map< std::string, Value > m_values; //! @cond @@ -557,6 +797,9 @@ namespace OIC public: ComparisonHelper(const Value&); + ComparisonHelper(const ComparisonHelper&) = delete; + ComparisonHelper& operator=(const ComparisonHelper&) = delete; + template< typename T > typename std::enable_if< is_supported_type< T >::value, bool >::type equals( const T& v) const @@ -575,6 +818,7 @@ namespace OIC const Value& m_valueRef; }; + //! @cond template< typename T > struct RCSResourceAttributes::IsSupportedTypeHelper { @@ -594,6 +838,7 @@ namespace OIC }; template < typename T > constexpr int RCSResourceAttributes::IndexOfType< T >::value; + //! @endcond /** * @relates RCSResourceAttributes::Type @@ -603,7 +848,7 @@ namespace OIC * @return true if the objects are equal, false otherwise. */ bool operator==(const RCSResourceAttributes::Type&, const RCSResourceAttributes::Type&) - noexcept; + BOOST_NOEXCEPT; /** * @relates RCSResourceAttributes::Type @@ -613,7 +858,7 @@ namespace OIC * @return true if the objects are not equal, false otherwise. */ bool operator!=(const RCSResourceAttributes::Type&, const RCSResourceAttributes::Type&) - noexcept; + BOOST_NOEXCEPT; /** * @relates RCSResourceAttributes::Value @@ -704,32 +949,32 @@ namespace OIC class KeyVisitor: public boost::static_visitor< const std::string& > { public: - result_type operator()(iterator*) const noexcept; - result_type operator()(const_iterator*) const noexcept; + result_type operator()(iterator*) const BOOST_NOEXCEPT; + result_type operator()(const_iterator*) const BOOST_NOEXCEPT; }; class ValueVisitor: public boost::static_visitor< Value& > { public: - result_type operator()(iterator*) noexcept; + result_type operator()(iterator*) BOOST_NOEXCEPT; result_type operator()(const_iterator*); }; class ConstValueVisitor: public boost::static_visitor< const Value& > { public: - result_type operator()(iterator*) const noexcept; - result_type operator()(const_iterator*) const noexcept; + result_type operator()(iterator*) const BOOST_NOEXCEPT; + result_type operator()(const_iterator*) const BOOST_NOEXCEPT; }; public: - const std::string& key() const noexcept; - const RCSResourceAttributes::Value& value() const noexcept; + const std::string& key() const BOOST_NOEXCEPT; + const RCSResourceAttributes::Value& value() const BOOST_NOEXCEPT; RCSResourceAttributes::Value& value(); private: KeyValuePair(const KeyValuePair&) = default; - KeyValuePair(boost::variant< iterator*, const_iterator* >&&) noexcept; + KeyValuePair(boost::variant< iterator*, const_iterator* >&&) BOOST_NOEXCEPT; KeyValuePair& operator=(const KeyValuePair&) = default; @@ -761,9 +1006,9 @@ namespace OIC public: iterator(); - iterator(const iterator&) = default; + iterator(const iterator&); - iterator& operator=(const iterator&) = default; + iterator& operator=(const iterator&); reference operator*(); pointer operator->(); @@ -795,7 +1040,7 @@ namespace OIC * @see iterator */ class RCSResourceAttributes::const_iterator: - public std::iterator < std::forward_iterator_tag, + public std::iterator< std::forward_iterator_tag, const RCSResourceAttributes::KeyValuePair > { private: @@ -803,10 +1048,10 @@ namespace OIC public: const_iterator(); - const_iterator(const const_iterator&) = default; + const_iterator(const const_iterator&); const_iterator(const RCSResourceAttributes::iterator&); - const_iterator& operator=(const const_iterator&) = default; + const_iterator& operator=(const const_iterator&); const_iterator& operator=(const RCSResourceAttributes::iterator&); reference operator*() const;