replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / resource-encapsulation / include / RCSResourceAttributes.h
index d20985e..99d29bf 100644 (file)
 #include <unordered_map>
 #include <vector>
 
-#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 "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 <RCSException.h>
+#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.<br/>
+        * 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<uint8_t> DataType;
+
+            /**
+             * Returns a vector<uint8_t> type of byte string.
+             *
+             * @return A stored byte string with std::vector<uint8_t>
+             */
+            DataType getByteString() const
+            {
+                return {m_data};
+            }
+
+            /**
+             * Returns a size of stored vector<uint8_t>.
+             *
+             * @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
 
         /**
         * This represents the attributes for a resource.
@@ -65,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 > >,
@@ -97,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 >
@@ -109,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;
             };
@@ -151,6 +325,7 @@ namespace OIC
                 DOUBLE, /**< double */
                 BOOL, /**< bool */
                 STRING, /**< std::string */
+                BYTESTRING, /**< RCSByteString */
                 ATTRIBUTES, /**< RCSResourceAttributes */
                 VECTOR /**< std::vector */
             };
@@ -178,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.
@@ -190,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.
@@ -199,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.
@@ -211,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 };
                 }
@@ -226,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 }
                 {
                 }
@@ -256,12 +431,14 @@ namespace OIC
                 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 > >
@@ -276,6 +453,9 @@ 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 > > >
              * @endcode
@@ -291,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.<br/>
@@ -360,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;
@@ -372,7 +552,14 @@ 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&)
                     {
@@ -393,7 +580,11 @@ namespace OIC
                     }
                 }
 
+#ifdef __APPLE__
+            public:
+#else
             private:
+#endif
                 boost::scoped_ptr< ValueVariant > m_data;
             };
 
@@ -412,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 <i>past-the-end element</i>.
              */
-            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 <i>past-the-end element</i>.
              */
-            const_iterator cend() const noexcept;
+            const_iterator cend() const BOOST_NOEXCEPT;
 
             /**
              * Accesses a value.
@@ -511,7 +702,7 @@ namespace OIC
             /**
              * Removes all elements.
              */
-            void clear() noexcept;
+            void clear() BOOST_NOEXCEPT;
 
             /**
              * Removes a single element.
@@ -523,6 +714,15 @@ namespace OIC
             bool erase(const std::string& 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.
@@ -536,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 >
@@ -558,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
@@ -582,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
@@ -600,6 +818,7 @@ namespace OIC
             const Value& m_valueRef;
         };
 
+        //! @cond
         template< typename T >
         struct RCSResourceAttributes::IsSupportedTypeHelper
         {
@@ -619,6 +838,7 @@ namespace OIC
         };
 
         template < typename T > constexpr int RCSResourceAttributes::IndexOfType< T >::value;
+        //! @endcond
 
         /**
          * @relates RCSResourceAttributes::Type
@@ -628,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
@@ -638,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
@@ -729,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;
 
@@ -786,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->();
@@ -820,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:
@@ -828,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;