1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #ifndef _INTEL_OCUTILITIES_H_
22 #define _INTEL_OCUTILITIES_H_
30 #include <OCException.h>
31 #include <StringConstants.h>
36 typedef std::map<std::string, std::string> QueryParamsKeyVal;
39 * @brief helper function that parses the query parameters component
40 * of a URI into a key-value map. This function expects the uri
41 * parameter to contain the query parameters component of a URI
42 * (everything after the '?', excluding anything anchors).
44 * Note that output will not perform URL decoding
46 QueryParamsKeyVal getQueryParams(const std::string& uri);
50 /* The C++11 standard unfortunately forgot to provide make_unique<>! However, if we're
51 using C++14 or later, we want to take the standard library's implementation: */
53 #if defined(__cplusplus) && __cplusplus < 201300
55 template<typename T, typename ...XS>
56 std::unique_ptr<T> make_unique(XS&& ...xs)
58 return std::unique_ptr<T>(new T(std::forward<XS>(xs)...));
62 using std::make_unique;
68 /* Examine an OCStackResult, and either forward its value or raise an exception: */
69 OCStackResult result_guard(const OCStackResult r);
71 /* Check for a nullptr, and throw an exception if we see one; otherwise, return the
72 result of the function call: */
73 template <typename PtrT, typename FnT, typename ...ParamTs>
74 auto nil_guard(PtrT&& p, FnT&& fn, ParamTs&& ...params) -> OCStackResult
78 throw OCException(OC::Exception::NIL_GUARD_NULL, OC_STACK_INVALID_PARAM);
81 // Note that although parameters are being forwarded, std::bind() will make a single copy:
82 return std::bind(fn, p, std::forward<ParamTs>(params)...)();
85 /* Check for nullptr and forward the result of an OC function call on success; raise
86 an exception on failure or exceptional result: */
87 template <typename PtrT, typename FnT, typename ...ParamTs>
88 auto checked_guard(PtrT&& p, FnT&& fn, ParamTs&& ...params) -> OCStackResult
90 return result_guard(nil_guard(p, fn, std::forward<ParamTs>(params)...));
97 template<typename T, typename = void>
100 constexpr static bool value = false;
105 typename std::enable_if<
106 std::is_same<T, std::vector<typename T::value_type, typename T::allocator_type>>::value
110 constexpr static bool value = true;