/**
* @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
#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
/**
- * 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)<br/>
* An attribute value can be one of various types. <br/>
*
- * @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
* @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 > >,
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 >
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;
};
DOUBLE, /**< double */
BOOL, /**< bool */
STRING, /**< std::string */
+ BYTESTRING, /**< RCSByteString */
ATTRIBUTES, /**< RCSResourceAttributes */
VECTOR /**< std::vector */
};
*
* @see getBaseTypeId
*/
- TypeId getId() const noexcept;
+ TypeId getId() const BOOST_NOEXCEPT;
/**
* Returns the type identifier of a base type of sequence.
* @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.
*
* @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.
* @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 };
}
* @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 }
{
}
*
* 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
Value();
Value(const Value&);
- Value(Value&&) noexcept;
+ Value(Value&&) BOOST_NOEXCEPT;
/**
* Constructs a Value if T is a supported type.<br/>
/**
* 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;
{
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" };
}
}
{
return get< T >() == rhs;
}
- catch (const BadGetException&)
+ catch (const RCSBadGetException&)
{
return false;
}
}
+#ifdef __APPLE__
+ public:
+#else
private:
+#endif
boost::scoped_ptr< ValueVariant > m_data;
};
/**
* 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.
/**
* Removes all elements.
*/
- void clear() noexcept;
+ void clear() BOOST_NOEXCEPT;
/**
* Removes a single element.
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.
*
*
* @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 >
}
}
+ 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
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
const Value& m_valueRef;
};
+ //! @cond
template< typename T >
struct RCSResourceAttributes::IsSupportedTypeHelper
{
};
template < typename T > constexpr int RCSResourceAttributes::IndexOfType< T >::value;
+ //! @endcond
/**
* @relates RCSResourceAttributes::Type
* @return true if the objects are equal, false otherwise.
*/
bool operator==(const RCSResourceAttributes::Type&, const RCSResourceAttributes::Type&)
- noexcept;
+ BOOST_NOEXCEPT;
/**
* @relates RCSResourceAttributes::Type
* @return true if the objects are not equal, false otherwise.
*/
bool operator!=(const RCSResourceAttributes::Type&, const RCSResourceAttributes::Type&)
- noexcept;
+ BOOST_NOEXCEPT;
/**
* @relates RCSResourceAttributes::Value
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;
public:
iterator();
- iterator(const iterator&) = default;
+ iterator(const iterator&);
- iterator& operator=(const iterator&) = default;
+ iterator& operator=(const iterator&);
reference operator*();
pointer operator->();
* @see iterator
*/
class RCSResourceAttributes::const_iterator:
- public std::iterator < std::forward_iterator_tag,
+ public std::iterator< std::forward_iterator_tag,
const RCSResourceAttributes::KeyValuePair >
{
private:
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;