github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/opencv4/include/opencv2/flann/any.h (about)

     1  #ifndef OPENCV_FLANN_ANY_H_
     2  #define OPENCV_FLANN_ANY_H_
     3  /*
     4   * (C) Copyright Christopher Diggins 2005-2011
     5   * (C) Copyright Pablo Aguilar 2005
     6   * (C) Copyright Kevlin Henney 2001
     7   *
     8   * Distributed under the Boost Software License, Version 1.0. (See
     9   * accompanying file LICENSE_1_0.txt or copy at
    10   * http://www.boost.org/LICENSE_1_0.txt
    11   *
    12   * Adapted for FLANN by Marius Muja
    13   */
    14  
    15  //! @cond IGNORED
    16  
    17  #include "defines.h"
    18  #include <stdexcept>
    19  #include <ostream>
    20  #include <typeinfo>
    21  
    22  namespace cvflann
    23  {
    24  
    25  namespace anyimpl
    26  {
    27  
    28  struct bad_any_cast
    29  {
    30  };
    31  
    32  struct empty_any
    33  {
    34  };
    35  
    36  inline std::ostream& operator <<(std::ostream& out, const empty_any&)
    37  {
    38      out << "[empty_any]";
    39      return out;
    40  }
    41  
    42  struct base_any_policy
    43  {
    44      virtual void static_delete(void** x) = 0;
    45      virtual void copy_from_value(void const* src, void** dest) = 0;
    46      virtual void clone(void* const* src, void** dest) = 0;
    47      virtual void move(void* const* src, void** dest) = 0;
    48      virtual void* get_value(void** src) = 0;
    49      virtual const void* get_value(void* const * src) = 0;
    50      virtual ::size_t get_size() = 0;
    51      virtual const std::type_info& type() = 0;
    52      virtual void print(std::ostream& out, void* const* src) = 0;
    53      virtual ~base_any_policy() {}
    54  };
    55  
    56  template<typename T>
    57  struct typed_base_any_policy : base_any_policy
    58  {
    59      virtual ::size_t get_size() CV_OVERRIDE { return sizeof(T); }
    60      virtual const std::type_info& type() CV_OVERRIDE { return typeid(T); }
    61  
    62  };
    63  
    64  template<typename T>
    65  struct small_any_policy CV_FINAL : typed_base_any_policy<T>
    66  {
    67      virtual void static_delete(void**) CV_OVERRIDE { }
    68      virtual void copy_from_value(void const* src, void** dest) CV_OVERRIDE
    69      {
    70          new (dest) T(* reinterpret_cast<T const*>(src));
    71      }
    72      virtual void clone(void* const* src, void** dest) CV_OVERRIDE { *dest = *src; }
    73      virtual void move(void* const* src, void** dest) CV_OVERRIDE { *dest = *src; }
    74      virtual void* get_value(void** src) CV_OVERRIDE { return reinterpret_cast<void*>(src); }
    75      virtual const void* get_value(void* const * src) CV_OVERRIDE { return reinterpret_cast<const void*>(src); }
    76      virtual void print(std::ostream& out, void* const* src) CV_OVERRIDE { out << *reinterpret_cast<T const*>(src); }
    77  };
    78  
    79  template<typename T>
    80  struct big_any_policy CV_FINAL : typed_base_any_policy<T>
    81  {
    82      virtual void static_delete(void** x) CV_OVERRIDE
    83      {
    84          if (* x) delete (* reinterpret_cast<T**>(x));
    85          *x = NULL;
    86      }
    87      virtual void copy_from_value(void const* src, void** dest) CV_OVERRIDE
    88      {
    89          *dest = new T(*reinterpret_cast<T const*>(src));
    90      }
    91      virtual void clone(void* const* src, void** dest) CV_OVERRIDE
    92      {
    93          *dest = new T(**reinterpret_cast<T* const*>(src));
    94      }
    95      virtual void move(void* const* src, void** dest) CV_OVERRIDE
    96      {
    97          (*reinterpret_cast<T**>(dest))->~T();
    98          **reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src);
    99      }
   100      virtual void* get_value(void** src) CV_OVERRIDE { return *src; }
   101      virtual const void* get_value(void* const * src) CV_OVERRIDE { return *src; }
   102      virtual void print(std::ostream& out, void* const* src) CV_OVERRIDE { out << *reinterpret_cast<T const*>(*src); }
   103  };
   104  
   105  template<> inline void big_any_policy<flann_centers_init_t>::print(std::ostream& out, void* const* src)
   106  {
   107      out << int(*reinterpret_cast<flann_centers_init_t const*>(*src));
   108  }
   109  
   110  template<> inline void big_any_policy<flann_algorithm_t>::print(std::ostream& out, void* const* src)
   111  {
   112      out << int(*reinterpret_cast<flann_algorithm_t const*>(*src));
   113  }
   114  
   115  template<> inline void big_any_policy<cv::String>::print(std::ostream& out, void* const* src)
   116  {
   117      out << (*reinterpret_cast<cv::String const*>(*src)).c_str();
   118  }
   119  
   120  template<typename T>
   121  struct choose_policy
   122  {
   123      typedef big_any_policy<T> type;
   124  };
   125  
   126  template<typename T>
   127  struct choose_policy<T*>
   128  {
   129      typedef small_any_policy<T*> type;
   130  };
   131  
   132  struct any;
   133  
   134  /// Choosing the policy for an any type is illegal, but should never happen.
   135  /// This is designed to throw a compiler error.
   136  template<>
   137  struct choose_policy<any>
   138  {
   139      typedef void type;
   140  };
   141  
   142  /// Specializations for small types.
   143  #define SMALL_POLICY(TYPE) \
   144      template<> \
   145      struct choose_policy<TYPE> { typedef small_any_policy<TYPE> type; \
   146      }
   147  
   148  SMALL_POLICY(signed char);
   149  SMALL_POLICY(unsigned char);
   150  SMALL_POLICY(signed short);
   151  SMALL_POLICY(unsigned short);
   152  SMALL_POLICY(signed int);
   153  SMALL_POLICY(unsigned int);
   154  SMALL_POLICY(signed long);
   155  SMALL_POLICY(unsigned long);
   156  SMALL_POLICY(float);
   157  SMALL_POLICY(bool);
   158  
   159  #undef SMALL_POLICY
   160  
   161  template <typename T>
   162  class SinglePolicy
   163  {
   164      SinglePolicy();
   165      SinglePolicy(const SinglePolicy& other);
   166      SinglePolicy& operator=(const SinglePolicy& other);
   167  
   168  public:
   169      static base_any_policy* get_policy();
   170  };
   171  
   172  /// This function will return a different policy for each type.
   173  template <typename T>
   174  inline base_any_policy* SinglePolicy<T>::get_policy()
   175  {
   176      static typename choose_policy<T>::type policy;
   177      return &policy;
   178  }
   179  
   180  } // namespace anyimpl
   181  
   182  struct any
   183  {
   184  private:
   185      // fields
   186      anyimpl::base_any_policy* policy;
   187      void* object;
   188  
   189  public:
   190      /// Initializing constructor.
   191      template <typename T>
   192      any(const T& x)
   193          : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
   194      {
   195          assign(x);
   196      }
   197  
   198      /// Empty constructor.
   199      any()
   200          : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
   201      { }
   202  
   203      /// Special initializing constructor for string literals.
   204      any(const char* x)
   205          : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
   206      {
   207          assign(x);
   208      }
   209  
   210      /// Copy constructor.
   211      any(const any& x)
   212          : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
   213      {
   214          assign(x);
   215      }
   216  
   217      /// Destructor.
   218      ~any()
   219      {
   220          policy->static_delete(&object);
   221      }
   222  
   223      /// Assignment function from another any.
   224      any& assign(const any& x)
   225      {
   226          reset();
   227          policy = x.policy;
   228          policy->clone(&x.object, &object);
   229          return *this;
   230      }
   231  
   232      /// Assignment function.
   233      template <typename T>
   234      any& assign(const T& x)
   235      {
   236          reset();
   237          policy = anyimpl::SinglePolicy<T>::get_policy();
   238          policy->copy_from_value(&x, &object);
   239          return *this;
   240      }
   241  
   242      /// Assignment operator.
   243      template<typename T>
   244      any& operator=(const T& x)
   245      {
   246          return assign(x);
   247      }
   248  
   249      /// Assignment operator. Template-based version above doesn't work as expected. We need regular assignment operator here.
   250      any& operator=(const any& x)
   251      {
   252          return assign(x);
   253      }
   254  
   255      /// Assignment operator, specialed for literal strings.
   256      /// They have types like const char [6] which don't work as expected.
   257      any& operator=(const char* x)
   258      {
   259          return assign(x);
   260      }
   261  
   262      /// Utility functions
   263      any& swap(any& x)
   264      {
   265          std::swap(policy, x.policy);
   266          std::swap(object, x.object);
   267          return *this;
   268      }
   269  
   270      /// Cast operator. You can only cast to the original type.
   271      template<typename T>
   272      T& cast()
   273      {
   274          if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
   275          T* r = reinterpret_cast<T*>(policy->get_value(&object));
   276          return *r;
   277      }
   278  
   279      /// Cast operator. You can only cast to the original type.
   280      template<typename T>
   281      const T& cast() const
   282      {
   283          if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
   284          const T* r = reinterpret_cast<const T*>(policy->get_value(&object));
   285          return *r;
   286      }
   287  
   288      /// Returns true if the any contains no value.
   289      bool empty() const
   290      {
   291          return policy->type() == typeid(anyimpl::empty_any);
   292      }
   293  
   294      /// Frees any allocated memory, and sets the value to NULL.
   295      void reset()
   296      {
   297          policy->static_delete(&object);
   298          policy = anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy();
   299      }
   300  
   301      /// Returns true if the two types are the same.
   302      bool compatible(const any& x) const
   303      {
   304          return policy->type() == x.policy->type();
   305      }
   306  
   307      /// Returns if the type is compatible with the policy
   308      template<typename T>
   309      bool has_type()
   310      {
   311          return policy->type() == typeid(T);
   312      }
   313  
   314      const std::type_info& type() const
   315      {
   316          return policy->type();
   317      }
   318  
   319      friend std::ostream& operator <<(std::ostream& out, const any& any_val);
   320  };
   321  
   322  inline std::ostream& operator <<(std::ostream& out, const any& any_val)
   323  {
   324      any_val.policy->print(out,&any_val.object);
   325      return out;
   326  }
   327  
   328  }
   329  
   330  //! @endcond
   331  
   332  #endif // OPENCV_FLANN_ANY_H_