1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2007-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4    Distributed under the Boost Software License, Version 1.0.
5       (See accompanying file LICENCE.txt or copy at
6            http://www.boost.org/LICENSE_1_0.txt)
7 +-----------------------------------------------------------------------------*/
8 #ifndef BOOST_ICL_TYPE_TO_STRING_HPP_JOFA_080416
9 #define BOOST_ICL_TYPE_TO_STRING_HPP_JOFA_080416
10 
11 #include <stdio.h>
12 #include <string>
13 #include <sstream>
14 
15 #include <boost/type_traits/is_integral.hpp>
16 #include <boost/type_traits/is_float.hpp>
17 #include <boost/mpl/if.hpp>
18 
19 namespace boost{ namespace icl
20 {
21     //--------------------------------------------------------------------------
22     template<class Type>
23     struct type_to_string
24     {
25         /** Convert the type to it's typestring */
26         static std::string apply();
27     };
28 
29 
30     //--------------------------------------------------------------------------
apply()31     template<>inline std::string type_to_string<bool>::apply() { return "bool"; }
apply()32     template<>inline std::string type_to_string<char>::apply() { return "char"; }
apply()33     template<>inline std::string type_to_string<short>::apply(){ return "short"; }
apply()34     template<>inline std::string type_to_string<int>::apply()  { return "int"; }
apply()35     template<>inline std::string type_to_string<long>::apply() { return "long"; }
apply()36     template<>inline std::string type_to_string<long long>::apply(){ return "Long"; }
37 
apply()38     template<>inline std::string type_to_string<unsigned char>::apply(){ return "char+"; }
apply()39     template<>inline std::string type_to_string<unsigned short>::apply(){ return "short+"; }
apply()40     template<>inline std::string type_to_string<unsigned int>::apply()  { return "int+"; }
apply()41     template<>inline std::string type_to_string<unsigned long>::apply() { return "long+"; }
apply()42     template<>inline std::string type_to_string<unsigned long long>::apply(){ return "Long+"; }
43 
apply()44     template<>inline std::string type_to_string<float>::apply() { return "flt"; }
apply()45     template<>inline std::string type_to_string<double>::apply() { return "dbl"; }
46 
47     //-------------------------------------------------------------------------
48     template<template<class> class Templ>
49     struct unary_template_to_string
50     {
51         static std::string apply();
52     };
53 
54     template <template<class>class Unary, class Type>
55     struct type_to_string<Unary<Type> >
56     {
to_stringboost::icl::type_to_string57         static std::string to_string()
58         {
59             return unary_template_to_string<Unary>::apply()+"<"+type_to_string<Type>::apply()+">";
60         }
61     };
62 
63     // ---------------------------------------------------------------------------
64     template<template<class,class>class Templ>
65     struct binary_template_to_string
66     {
67         static std::string apply();
68     };
69 
70     template <template<class Type1, class Type2>class Binary, class Type1, class Type2>
71     struct type_to_string<Binary<Type1, Type2> >
72     {
applyboost::icl::type_to_string73         static std::string apply()
74         {
75             return binary_template_to_string<Binary>::apply()+
76                 "<"+type_to_string<Type1>::apply()+","+type_to_string<Type2>::apply()+">";
77         }
78     };
79 
80     // ---------------------------------------------------------------------------
81     template<>
82     struct type_to_string<std::string>
83     {
applyboost::icl::type_to_string84         static std::string apply() { return "string"; }
85     };
86 
87 }} // namespace boost icl
88 
89 #endif
90 
91 
92