typedef V type;
};
- template< typename VISITOR >
+ template< typename VISITOR, typename MOVE = std::false_type >
class KeyValueVisitorHelper: public boost::static_visitor< >
{
public:
{
}
- 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;
};
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.
}
}
+ 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);
+ }
+ }
+
private:
std::unordered_map< std::string, Value > m_values;
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;
-#include "InterfaceHandler.h"\r
-\r
-#include "OCResourceRequest.h"\r
-\r
-#include "RCSRepresentation.h"\r
-#include "RCSRequest.h"\r
-#include "RCSResourceObject.h"\r
-#include "RCSResourceAttributes.h"\r
-#include "ResourceAttributesConverter.h"\r
-\r
-#include <unordered_map>\r
-\r
-namespace\r
-{\r
- using namespace OIC::Service;\r
-\r
- RCSRepresentation toRepresentation(const RCSResourceObject& resource)\r
- {\r
- RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };\r
-\r
- return RCSRepresentation{ resource.getUri(), resource.getInterfaces(), resource.getTypes(),\r
- resource.getAttributes()};\r
- }\r
-\r
- RCSRepresentation buildGetBaselineResponse(const RCSRequest&, const RCSResourceObject& resource)\r
- {\r
- return toRepresentation(resource);\r
- }\r
-\r
- RCSRepresentation buildSetBaselineResponse(const RCSRequest& rcsRequest,\r
- const RCSResourceObject& resource)\r
- {\r
- return buildGetBaselineResponse(rcsRequest, resource);\r
- }\r
-\r
- RCSRepresentation buildGetRequestResponse(const RCSRequest&, const RCSResourceObject& resource)\r
- {\r
- RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };\r
-\r
- return RCSRepresentation{ resource.getAttributes() };\r
- }\r
-\r
- RCSRepresentation buildSetRequestResponse(const RCSRequest& rcsRequest,\r
- const RCSResourceObject& resource)\r
- {\r
- auto requestAttr = ResourceAttributesConverter::fromOCRepresentation(\r
- (rcsRequest.getOCRequest())->getResourceRepresentation());\r
-\r
- RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };\r
-\r
- const RCSResourceAttributes& updatedAttr = resource.getAttributes();\r
-\r
- for (auto& kvPair : requestAttr)\r
- {\r
- if(updatedAttr.contains(kvPair.key()))\r
- {\r
- kvPair.value() = updatedAttr.at(kvPair.key());\r
- }\r
- else\r
- {\r
- //FIXME erase item with iterator.\r
- requestAttr.erase(kvPair.key());\r
- }\r
- }\r
-\r
- return RCSRepresentation{ requestAttr };\r
- }\r
-\r
- RCSRepresentation buildGetBatchResponse(RCSRequest, const RCSResourceObject& resource)\r
- {\r
- RCSRepresentation rcsRep;\r
-\r
- for (const auto& bound : resource.getBoundResources())\r
- {\r
- rcsRep.addChild(toRepresentation(*bound));\r
- }\r
-\r
- return rcsRep;\r
- }\r
-\r
- const std::unordered_map< std::string, InterfaceHandler > g_defaultHandlers {\r
-\r
- { BASELINE_INTERFACE,\r
- InterfaceHandler(buildGetBaselineResponse, buildSetBaselineResponse) },\r
-\r
- { ACTUATOR_INTERFACE,\r
- InterfaceHandler(buildGetRequestResponse, buildSetRequestResponse) },\r
-\r
- { SENSOR_INTERFACE,\r
- InterfaceHandler(buildGetRequestResponse, nullptr) },\r
-\r
- { BATCH_INTERFACE,\r
- InterfaceHandler(buildGetBatchResponse, buildSetBaselineResponse) }\r
- };\r
-}\r
-\r
-namespace OIC\r
-{\r
- namespace Service\r
- {\r
-\r
- InterfaceHandler::InterfaceHandler(GetResponseBuilder getBuilder,\r
- SetResponseBuilder setBuilder) :\r
- m_getBuilder{ std::move(getBuilder) },\r
- m_setBuilder{ std::move(setBuilder) }\r
- {\r
- }\r
-\r
- bool InterfaceHandler::isGetSupported() const\r
- {\r
- return m_getBuilder != nullptr;\r
- }\r
-\r
- bool InterfaceHandler::isSetSupported() const\r
- {\r
- return m_setBuilder != nullptr;\r
- }\r
-\r
- InterfaceHandler::GetResponseBuilder InterfaceHandler::getGetResponseBuilder() const\r
- {\r
- return m_getBuilder;\r
- }\r
-\r
- InterfaceHandler::SetResponseBuilder InterfaceHandler::getSetResponseBuilder() const\r
- {\r
- return m_setBuilder;\r
- }\r
-\r
- InterfaceHandler getDefaultInterfaceHandler(const std::string& interfaceName,\r
- const std::string& defaultInterfaceName)\r
- {\r
- auto it = g_defaultHandlers.find(interfaceName);\r
- if (it != g_defaultHandlers.end()) return it->second;\r
-\r
- it = g_defaultHandlers.find(defaultInterfaceName);\r
- if (it != g_defaultHandlers.end()) return it->second;\r
-\r
- return g_defaultHandlers.find(OIC::Service::BASELINE_INTERFACE)->second;\r
- }\r
- }\r
-}\r
+#include "InterfaceHandler.h"
+
+#include "OCResourceRequest.h"
+
+#include "RCSRepresentation.h"
+#include "RCSRequest.h"
+#include "RCSResourceObject.h"
+#include "RCSResourceAttributes.h"
+#include "ResourceAttributesConverter.h"
+
+#include <unordered_map>
+
+namespace
+{
+ using namespace OIC::Service;
+
+ RCSRepresentation toRepresentation(const RCSResourceObject& resource)
+ {
+ RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };
+
+ return RCSRepresentation{ resource.getUri(), resource.getInterfaces(), resource.getTypes(),
+ resource.getAttributes() };
+ }
+
+ RCSRepresentation buildGetBaselineResponse(const RCSRequest&, const RCSResourceObject& resource)
+ {
+ return toRepresentation(resource);
+ }
+
+ RCSRepresentation buildSetBaselineResponse(const RCSRequest& rcsRequest,
+ const RCSResourceObject& resource)
+ {
+ return buildGetBaselineResponse(rcsRequest, resource);
+ }
+
+ RCSRepresentation buildGetRequestResponse(const RCSRequest&, const RCSResourceObject& resource)
+ {
+ RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };
+
+ return RCSRepresentation{ resource.getAttributes() };
+ }
+
+ RCSRepresentation buildSetRequestResponse(const RCSRequest& rcsRequest,
+ const RCSResourceObject& resource)
+ {
+ auto requestAttr = ResourceAttributesConverter::fromOCRepresentation(
+ rcsRequest.getOCRequest()->getResourceRepresentation());
+
+ RCSResourceObject::LockGuard lock{ resource, RCSResourceObject::AutoNotifyPolicy::NEVER };
+
+ const RCSResourceAttributes& updatedAttr = resource.getAttributes();
+
+ for (auto it = requestAttr.begin(); it != requestAttr.end();)
+ {
+ if(updatedAttr.contains(it->key()))
+ {
+ it->value() = updatedAttr.at(it->key());
+ ++it;
+ }
+ else
+ {
+ it = requestAttr.erase(it);
+ }
+ }
+
+ return RCSRepresentation{ requestAttr };
+ }
+
+ RCSRepresentation buildGetBatchResponse(RCSRequest, const RCSResourceObject& resource)
+ {
+ RCSRepresentation rcsRep;
+
+ for (const auto& bound : resource.getBoundResources())
+ {
+ rcsRep.addChild(toRepresentation(*bound));
+ }
+
+ return rcsRep;
+ }
+
+ const std::unordered_map< std::string, InterfaceHandler > g_defaultHandlers {
+
+ { BASELINE_INTERFACE,
+ InterfaceHandler(buildGetBaselineResponse, buildSetBaselineResponse) },
+
+ { ACTUATOR_INTERFACE,
+ InterfaceHandler(buildGetRequestResponse, buildSetRequestResponse) },
+
+ { SENSOR_INTERFACE,
+ InterfaceHandler(buildGetRequestResponse, nullptr) },
+
+ { BATCH_INTERFACE,
+ InterfaceHandler(buildGetBatchResponse, buildSetBaselineResponse) }
+ };
+}
+
+namespace OIC
+{
+ namespace Service
+ {
+
+ InterfaceHandler::InterfaceHandler(GetResponseBuilder getBuilder,
+ SetResponseBuilder setBuilder) :
+ m_getBuilder{ std::move(getBuilder) },
+ m_setBuilder{ std::move(setBuilder) }
+ {
+ }
+
+ bool InterfaceHandler::isGetSupported() const
+ {
+ return m_getBuilder != nullptr;
+ }
+
+ bool InterfaceHandler::isSetSupported() const
+ {
+ return m_setBuilder != nullptr;
+ }
+
+ InterfaceHandler::GetResponseBuilder InterfaceHandler::getGetResponseBuilder() const
+ {
+ return m_getBuilder;
+ }
+
+ InterfaceHandler::SetResponseBuilder InterfaceHandler::getSetResponseBuilder() const
+ {
+ return m_setBuilder;
+ }
+
+ InterfaceHandler getDefaultInterfaceHandler(const std::string& interfaceName,
+ const std::string& defaultInterfaceName)
+ {
+ auto it = g_defaultHandlers.find(interfaceName);
+ if (it != g_defaultHandlers.end()) return it->second;
+
+ it = g_defaultHandlers.find(defaultInterfaceName);
+ if (it != g_defaultHandlers.end()) return it->second;
+
+ return g_defaultHandlers.find(OIC::Service::BASELINE_INTERFACE)->second;
+ }
+ }
+}