#pragma once #ifndef TCG_TRAITS_H #define TCG_TRAITS_H // STD includes #include //-------------------------------------------------------------------------- namespace tcg { //**************************************************************************** // TCG traits for generic type concepts //**************************************************************************** template struct traits { typedef T *pointer_type; typedef T pointed_type; typedef T &reference_type; typedef T referenced_type; typedef T element_type; }; template struct traits { typedef T **pointer_type; typedef T pointed_type; typedef T *&reference_type; typedef T *referenced_type; typedef T *element_type; }; template struct traits : public traits { typedef T element_type; }; template struct traits : public traits {}; template <> struct traits { typedef void *pointer_type; typedef void pointed_type; typedef void reference_type; typedef void referenced_type; }; //**************************************************************************** // Qualifier removers //**************************************************************************** template struct remove_const { typedef T type; }; template struct remove_const { typedef T type; }; template struct remove_ref { typedef T type; }; template struct remove_ref { typedef T type; }; template struct remove_cref { typedef typename remove_const::type>::type type; }; //****************************************************************************** // TCG traits for output container readers //****************************************************************************** template struct container_reader_traits { 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(); } }; //************************************************************************************ // Notable Test traits //************************************************************************************ template struct is_floating_point { enum { value = false }; }; template <> struct is_floating_point { enum { value = true }; }; template <> struct is_floating_point { enum { value = true }; }; template <> struct is_floating_point { enum { value = true }; }; } // namespace tcg #endif // TCG_TRAITS_H