tahoma2d/toonz/sources/include/tcg/traits.h

121 lines
2.8 KiB
C
Raw Normal View History

2016-05-17 03:04:11 +12:00
#pragma once
2016-03-19 06:57:51 +13:00
#ifndef TCG_TRAITS_H
#define TCG_TRAITS_H
// STD includes
#include <iterator>
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
namespace tcg {
2016-03-19 06:57:51 +13:00
//****************************************************************************
// TCG traits for generic type concepts
//****************************************************************************
template <typename T>
struct traits {
2016-06-15 18:43:10 +12:00
typedef T *pointer_type;
typedef T pointed_type;
typedef T &reference_type;
typedef T referenced_type;
typedef T element_type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct traits<T *> {
2016-06-15 18:43:10 +12:00
typedef T **pointer_type;
typedef T pointed_type;
typedef T *&reference_type;
typedef T *referenced_type;
typedef T *element_type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct traits<T[]> : public traits<T *> {
2016-06-15 18:43:10 +12:00
typedef T element_type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
2016-06-15 18:43:10 +12:00
struct traits<T &> : public traits<T> {};
2016-03-19 06:57:51 +13:00
template <>
struct traits<void> {
2016-06-15 18:43:10 +12:00
typedef void *pointer_type;
typedef void pointed_type;
typedef void reference_type;
typedef void referenced_type;
2016-03-19 06:57:51 +13:00
};
//****************************************************************************
// Qualifier removers
//****************************************************************************
template <typename T>
struct remove_const {
2016-06-15 18:43:10 +12:00
typedef T type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct remove_const<const T> {
2016-06-15 18:43:10 +12:00
typedef T type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct remove_ref {
2016-06-15 18:43:10 +12:00
typedef T type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct remove_ref<T &> {
2016-06-15 18:43:10 +12:00
typedef T type;
2016-03-19 06:57:51 +13:00
};
template <typename T>
struct remove_cref {
2016-06-15 18:43:10 +12:00
typedef typename remove_const<typename remove_ref<T>::type>::type type;
2016-03-19 06:57:51 +13:00
};
//******************************************************************************
// TCG traits for output container readers
//******************************************************************************
template <typename Reader, typename OutputData = typename Reader::value_type>
struct container_reader_traits {
2016-06-15 18:43:10 +12:00
typedef Reader reader_type;
typedef OutputData value_type;
static void openContainer(reader_type &reader) { reader.openContainer(); }
static void addElement(reader_type &reader, const value_type &data) {
reader.addElement(data);
}
static void closeContainer(reader_type &reader) { reader.closeContainer(); }
2016-03-19 06:57:51 +13:00
};
//************************************************************************************
// Notable Test traits
//************************************************************************************
template <typename T>
struct is_floating_point {
2016-06-15 18:43:10 +12:00
enum { value = false };
2016-03-19 06:57:51 +13:00
};
template <>
struct is_floating_point<float> {
2016-06-15 18:43:10 +12:00
enum { value = true };
2016-03-19 06:57:51 +13:00
};
template <>
struct is_floating_point<double> {
2016-06-15 18:43:10 +12:00
enum { value = true };
2016-03-19 06:57:51 +13:00
};
template <>
struct is_floating_point<long double> {
2016-06-15 18:43:10 +12:00
enum { value = true };
2016-03-19 06:57:51 +13:00
};
2016-06-15 18:43:10 +12:00
} // namespace tcg
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
#endif // TCG_TRAITS_H