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
|