diff options
Diffstat (limited to 'ml/dlib/dlib/is_kind.h')
-rw-r--r-- | ml/dlib/dlib/is_kind.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/ml/dlib/dlib/is_kind.h b/ml/dlib/dlib/is_kind.h new file mode 100644 index 000000000..e8dcb6320 --- /dev/null +++ b/ml/dlib/dlib/is_kind.h @@ -0,0 +1,162 @@ +// Copyright (C) 2007 Davis E. King (davis@dlib.net) +// License: Boost Software License See LICENSE.txt for the full license. +#ifndef DLIB_IS_KINd_H_ +#define DLIB_IS_KINd_H_ + +#include <vector> + +namespace dlib +{ + /*! + This file contains a set of templates that enable you to determine if + a given type implements an abstract interface defined in one of the + dlib *_abstract.h files. + !*/ + +// ---------------------------------------------------------------------------------------- + + struct default_is_kind_value { static const bool value = false; }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_graph : public default_is_kind_value + { + /*! + - if (T is an implementation of graph/graph_kernel_abstract.h) then + - is_graph<T>::value == true + - else + - is_graph<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_directed_graph : public default_is_kind_value + { + /*! + - if (T is an implementation of directed_graph/directed_graph_kernel_abstract.h) then + - is_directed_graph<T>::value == true + - else + - is_directed_graph<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T, typename helper = void> + struct is_matrix : public default_is_kind_value + { + /*! + - if (T is some kind of matrix expression from the matrix/matrix_exp_abstract.h component) then + - is_matrix<T>::value == true + - else + - is_matrix<T>::value == false + !*/ + + // Don't set the helper to anything. Just let it be void. + ASSERT_ARE_SAME_TYPE(helper,void); + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_array2d : public default_is_kind_value + { + /*! + - if (T is an implementation of array2d/array2d_kernel_abstract.h) then + - is_array2d<T>::value == true + - else + - is_array2d<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_array : public default_is_kind_value + { + /*! + - if (T is an implementation of array/array_kernel_abstract.h) then + - is_array<T>::value == true + - else + - is_array<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_std_vector : public default_is_kind_value + { + /*! + - if (T is an implementation of the standard C++ std::vector object) then + - is_std_vector<T>::value == true + - else + - is_std_vector<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_pair : public default_is_kind_value + { + /*! + - if (T is a std::pair object) then + - is_std_vector<T>::value == true + - else + - is_std_vector<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_rand : public default_is_kind_value + { + /*! + - if (T is an implementation of rand/rand_kernel_abstract.h) then + - is_rand<T>::value == true + - else + - is_rand<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct is_config_reader : public default_is_kind_value + { + /*! + - if (T is an implementation of config_reader/config_reader_kernel_abstract.h) then + - is_config_reader<T>::value == true + - else + - is_config_reader<T>::value == false + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- +// Implementation details +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + template <typename T, typename alloc> + struct is_std_vector<std::vector<T,alloc> > { const static bool value = true; }; + template <typename T> struct is_std_vector<T&> { const static bool value = is_std_vector<T>::value; }; + template <typename T> struct is_std_vector<const T&>{ const static bool value = is_std_vector<T>::value; }; + template <typename T> struct is_std_vector<const T> { const static bool value = is_std_vector<T>::value; }; + +// ---------------------------------------------------------------------------------------- + + template <typename T, typename U> + struct is_pair<std::pair<T,U> > { const static bool value = true; }; + +// ---------------------------------------------------------------------------------------- + +} + +#endif // DLIB_IS_KINd_H_ + |