| /*-----------------------------------------------------------------------------+ |
| Copyright (c) 2007-2009: Joachim Faulhaber |
| +------------------------------------------------------------------------------+ |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENCE.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt) |
| +-----------------------------------------------------------------------------*/ |
| #ifndef BOOST_ICL_TYPE_TO_STRING_HPP_JOFA_080416 |
| #define BOOST_ICL_TYPE_TO_STRING_HPP_JOFA_080416 |
| |
| #include <stdio.h> |
| #include <string> |
| #include <sstream> |
| |
| #include <boost/type_traits/is_integral.hpp> |
| #include <boost/type_traits/is_float.hpp> |
| #include <boost/mpl/if.hpp> |
| |
| namespace boost{ namespace icl |
| { |
| //-------------------------------------------------------------------------- |
| template<class Type> |
| struct type_to_string |
| { |
| /** Convert the type to it's typestring */ |
| static std::string apply(); |
| }; |
| |
| |
| //-------------------------------------------------------------------------- |
| template<>inline std::string type_to_string<bool>::apply() { return "bool"; } |
| template<>inline std::string type_to_string<char>::apply() { return "char"; } |
| template<>inline std::string type_to_string<short>::apply(){ return "short"; } |
| template<>inline std::string type_to_string<int>::apply() { return "int"; } |
| template<>inline std::string type_to_string<long>::apply() { return "long"; } |
| template<>inline std::string type_to_string<long long>::apply(){ return "Long"; } |
| |
| template<>inline std::string type_to_string<unsigned char>::apply(){ return "char+"; } |
| template<>inline std::string type_to_string<unsigned short>::apply(){ return "short+"; } |
| template<>inline std::string type_to_string<unsigned int>::apply() { return "int+"; } |
| template<>inline std::string type_to_string<unsigned long>::apply() { return "long+"; } |
| template<>inline std::string type_to_string<unsigned long long>::apply(){ return "Long+"; } |
| |
| template<>inline std::string type_to_string<float>::apply() { return "flt"; } |
| template<>inline std::string type_to_string<double>::apply() { return "dbl"; } |
| template<>inline std::string type_to_string<std::string>::apply() { return "string"; } |
| |
| //------------------------------------------------------------------------- |
| template<template<class> class Templ> |
| struct unary_template_to_string |
| { |
| static std::string apply(); |
| }; |
| |
| template <template<class>class Unary, class Type> |
| struct type_to_string<Unary<Type> > |
| { |
| static std::string to_string() |
| { |
| return unary_template_to_string<Unary>::apply()+"<"+type_to_string<Type>::apply()+">"; |
| } |
| }; |
| |
| // --------------------------------------------------------------------------- |
| template<template<class,class>class Templ> |
| struct binary_template_to_string |
| { |
| static std::string apply(); |
| }; |
| |
| template <template<class Type1, class Type2>class Binary, class Type1, class Type2> |
| struct type_to_string<Binary<Type1, Type2> > |
| { |
| static std::string apply() |
| { |
| return binary_template_to_string<Binary>::apply()+ |
| "<"+type_to_string<Type1>::apply()+","+type_to_string<Type2>::apply()+">"; |
| } |
| }; |
| |
| }} // namespace boost icl |
| |
| #endif |
| |
| |