1 // Copyright (C) 2018-2020 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
6 * @brief A header file for the CNNNetworkIterator class
8 * @file ie_cnn_network_iterator.hpp
14 #include <details/ie_exception.hpp>
32 namespace InferenceEngine {
35 * @brief This class represents an object to work with different parameters
38 class INFERENCE_ENGINE_API_CLASS(Parameter) {
41 * @brief Default constructor
43 Parameter() = default;
46 * @brief Move constructor
48 * @param parameter Parameter object
50 Parameter(Parameter&& parameter) noexcept {
51 std::swap(ptr, parameter.ptr);
55 * @brief Creates parameter from variant.
56 * This method creates empty parameter if variant doesn't contain Parameter
58 * @param var ngraph variant
60 Parameter(const std::shared_ptr<ngraph::Variant>& var);
63 * @brief Creates parameter from variant.
64 * This method creates empty parameter if variant doesn't contain Parameter
66 * @param var ngraph variant
68 Parameter(std::shared_ptr<ngraph::Variant>& var);
71 * @brief Copy constructor
73 * @param parameter Parameter object
75 Parameter(const Parameter& parameter) {
80 * @brief Constructor creates parameter with object
82 * @tparam T Parameter type
83 * @tparam U Identity type-transformation
84 * @param parameter object
87 typename = typename std::enable_if<!std::is_same<typename std::decay<T>::type, Parameter>::value>::type>
88 Parameter(T&& parameter) { // NOLINT
89 static_assert(!std::is_same<typename std::decay<T>::type, Parameter>::value, "To prevent recursion");
90 ptr = new RealData<typename std::decay<T>::type>(std::forward<T>(parameter));
94 * @brief Constructor creates string parameter from char *
96 * @param str char array
98 Parameter(const char* str): Parameter(std::string(str)) {} // NOLINT
103 virtual ~Parameter();
106 * Copy operator for Parameter
107 * @param parameter Parameter object
110 Parameter& operator=(const Parameter& parameter) {
111 if (this == ¶meter) {
115 if (!parameter.empty()) ptr = parameter.ptr->copy();
120 * Remove a value from parameter
128 * Checks that parameter contains a value
129 * @return false if parameter contains a value else false
131 bool empty() const noexcept {
132 return nullptr == ptr;
136 * Checks the type of value
137 * @tparam T Type of value
138 * @return true if type of value is correct
142 return empty() ? false : ptr->is(typeid(T));
146 * Dynamic cast to specified type
148 * @return casted object
150 template <typename T>
152 return std::move(dyn_cast<T>(ptr));
156 * Dynamic cast to specified type
158 * @return casted object
162 return dyn_cast<T>(ptr);
165 * Dynamic cast to specified type
167 * @return casted object
170 const T& as() const& {
171 return dyn_cast<T>(ptr);
175 * Dynamic cast to specified type
177 * @return casted object
181 return std::move(dyn_cast<typename std::remove_cv<T>::type>(ptr));
185 * Dynamic cast to specified type
187 * @return casted object
191 return dyn_cast<typename std::remove_cv<T>::type>(ptr);
195 * Dynamic cast to specified type
197 * @return casted object
200 operator const T&() const& {
201 return dyn_cast<typename std::remove_cv<T>::type>(ptr);
205 * @brief Converts parameter to shared pointer on ngraph::Variant
207 * @return shared pointer on ngraph::Variant
209 std::shared_ptr<ngraph::Variant> asVariant() const;
212 * @brief Casts to shared pointer on ngraph::Variant
214 * @return shared pointer on ngraph::Variant
216 operator std::shared_ptr<ngraph::Variant>() const {
221 * Dynamic cast to specified type
223 * @return casted object
226 operator T&() const& {
227 return dyn_cast<typename std::remove_cv<T>::type>(ptr);
231 * @brief The comparison operator for the Parameter
233 * @param rhs object to compare
234 * @return true if objects are equal
236 bool operator==(const Parameter& rhs) const {
237 return *ptr == *(rhs.ptr);
240 * @brief The comparison operator for the Parameter
242 * @param rhs object to compare
243 * @return true if objects aren't equal
245 bool operator!=(const Parameter& rhs) const {
246 return !(*this == rhs);
250 template <class T, class EqualTo>
251 struct CheckOperatorEqual {
252 template <class U, class V>
253 static auto test(U*) -> decltype(std::declval<U>() == std::declval<V>()) {
257 template <typename, typename>
258 static auto test(...) -> std::false_type {
262 using type = typename std::is_same<bool, decltype(test<T, EqualTo>(nullptr))>::type;
265 template <class T, class EqualTo = T>
266 struct HasOperatorEqual : CheckOperatorEqual<T, EqualTo>::type {};
272 virtual ~Any() = default;
274 virtual bool is(const std::type_info&) const = 0;
275 virtual Any* copy() const = 0;
276 virtual bool operator==(const Any& rhs) const = 0;
280 struct RealData : Any, std::tuple<T> {
281 using std::tuple<T>::tuple;
283 bool is(const std::type_info& id) const override {
284 return id == typeid(T);
286 Any* copy() const override {
287 return new RealData {get()};
291 return std::get<0>(*static_cast<std::tuple<T>*>(this));
294 const T& get() const& {
295 return std::get<0>(*static_cast<const std::tuple<T>*>(this));
299 typename std::enable_if<!HasOperatorEqual<U>::value, bool>::type equal(const Any& left, const Any& rhs) const {
300 THROW_IE_EXCEPTION << "Parameter doesn't contain equal operator";
304 typename std::enable_if<HasOperatorEqual<U>::value, bool>::type equal(const Any& left, const Any& rhs) const {
305 return dyn_cast<U>(&left) == dyn_cast<U>(&rhs);
308 bool operator==(const Any& rhs) const override {
309 return rhs.is(typeid(T)) && equal<T>(*this, rhs);
313 template <typename T>
314 static T& dyn_cast(Any* obj) {
315 if (obj == nullptr) THROW_IE_EXCEPTION << "Parameter is empty!";
316 return dynamic_cast<RealData<T>&>(*obj).get();
319 template <typename T>
320 static const T& dyn_cast(const Any* obj) {
321 if (obj == nullptr) THROW_IE_EXCEPTION << "Parameter is empty!";
322 return dynamic_cast<const RealData<T>&>(*obj).get();
329 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<int>);
330 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<bool>);
331 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<float>);
332 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<uint32_t>);
333 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<std::string>);
334 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<unsigned long>);
335 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<std::vector<int>>);
336 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<std::vector<std::string>>);
337 extern template struct INFERENCE_ENGINE_API_CLASS(InferenceEngine::Parameter::RealData<std::vector<unsigned long>>);
338 extern template struct INFERENCE_ENGINE_API_CLASS(
339 InferenceEngine::Parameter::RealData<std::tuple<unsigned int, unsigned int>>);
340 extern template struct INFERENCE_ENGINE_API_CLASS(
341 InferenceEngine::Parameter::RealData<std::tuple<unsigned int, unsigned int, unsigned int>>);
344 } // namespace InferenceEngine