$search
00001 #include "standard_types.hh" 00002 #include "containers.hh" 00003 #include <boost/lexical_cast.hpp> 00004 #include "typelib/typename.hh" 00005 00006 using namespace Typelib; 00007 00008 static void addStandardTypes(Typelib::Registry& r) 00009 { 00010 BOOST_STATIC_ASSERT((Typelib::NamespaceMark == '/')); 00011 00012 r.add(new NullType("/nil")); 00013 r.alias("/nil", "/void"); 00014 00015 // Add standard sized integers 00016 static const int sizes[] = { 1, 2, 4, 8 }; 00017 for (int i = 0; i < 4; ++i) 00018 { 00019 std::string suffix = "int" + boost::lexical_cast<std::string>(sizes[i] * 8) + "_t"; 00020 r.add(new Numeric("/" + suffix, sizes[i], Numeric::SInt)); 00021 r.add(new Numeric("/u" + suffix, sizes[i], Numeric::UInt)); 00022 } 00023 00024 std::string normalized_type_name = "/int" + boost::lexical_cast<std::string>(std::numeric_limits<signed char>::digits + 1) + "_t"; 00025 r.alias(normalized_type_name, "/signed char"); 00026 if (std::numeric_limits<char>::is_signed) 00027 r.alias(normalized_type_name, "/char"); 00028 normalized_type_name = "/uint" + boost::lexical_cast<std::string>(std::numeric_limits<signed char>::digits + 1) + "_t"; 00029 if (!std::numeric_limits<char>::is_signed) 00030 r.alias(normalized_type_name, "/char"); 00031 r.alias(normalized_type_name, "/unsigned char"); 00032 00033 00034 normalized_type_name = "/int" + boost::lexical_cast<std::string>(std::numeric_limits<short int>::digits + 1) + "_t"; 00035 r.alias(normalized_type_name, "/signed short int"); 00036 r.alias(normalized_type_name, "/signed int short"); 00037 r.alias(normalized_type_name, "/int signed short"); 00038 r.alias(normalized_type_name, "/short signed int"); 00039 r.alias(normalized_type_name, "/signed short int"); 00040 r.alias(normalized_type_name, "/signed short"); 00041 r.alias(normalized_type_name, "/short signed"); 00042 r.alias(normalized_type_name, "/short"); 00043 r.alias(normalized_type_name, "/short int"); 00044 normalized_type_name = "/uint" + boost::lexical_cast<std::string>(std::numeric_limits<short int>::digits + 1) + "_t"; 00045 r.alias(normalized_type_name, "/short unsigned int"); 00046 r.alias(normalized_type_name, "/short int unsigned"); 00047 r.alias(normalized_type_name, "/int short unsigned"); 00048 r.alias(normalized_type_name, "/unsigned short int"); 00049 r.alias(normalized_type_name, "/short unsigned"); 00050 r.alias(normalized_type_name, "/unsigned short"); 00051 00052 normalized_type_name = "/int" + boost::lexical_cast<std::string>(std::numeric_limits<int>::digits + 1) + "_t"; 00053 r.alias(normalized_type_name, "/signed int"); 00054 r.alias(normalized_type_name, "/signed"); 00055 r.alias(normalized_type_name, "/int signed"); 00056 r.alias(normalized_type_name, "/int"); 00057 normalized_type_name = "/uint" + boost::lexical_cast<std::string>(std::numeric_limits<int>::digits + 1) + "_t"; 00058 r.alias(normalized_type_name, "/unsigned int"); 00059 r.alias(normalized_type_name, "/unsigned"); 00060 r.alias(normalized_type_name, "/int unsigned"); 00061 00062 normalized_type_name = "/int" + boost::lexical_cast<std::string>(std::numeric_limits<long>::digits + 1) + "_t"; 00063 r.alias(normalized_type_name, "/signed long int"); 00064 r.alias(normalized_type_name, "/signed int long"); 00065 r.alias(normalized_type_name, "/int signed long"); 00066 r.alias(normalized_type_name, "/long signed int"); 00067 r.alias(normalized_type_name, "/signed long int"); 00068 r.alias(normalized_type_name, "/signed long"); 00069 r.alias(normalized_type_name, "/long signed"); 00070 r.alias(normalized_type_name, "/long"); 00071 r.alias(normalized_type_name, "/long int"); 00072 normalized_type_name = "/uint" + boost::lexical_cast<std::string>(std::numeric_limits<long>::digits + 1) + "_t"; 00073 r.alias(normalized_type_name, "/long unsigned int"); 00074 r.alias(normalized_type_name, "/long int unsigned"); 00075 r.alias(normalized_type_name, "/int long unsigned"); 00076 r.alias(normalized_type_name, "/unsigned long int"); 00077 r.alias(normalized_type_name, "/long unsigned"); 00078 r.alias(normalized_type_name, "/unsigned long"); 00079 00080 normalized_type_name = "/int" + boost::lexical_cast<std::string>(std::numeric_limits<long long>::digits + 1) + "_t"; 00081 r.alias(normalized_type_name, "/signed long long int"); 00082 r.alias(normalized_type_name, "/signed long int long"); 00083 r.alias(normalized_type_name, "/signed int long long"); 00084 r.alias(normalized_type_name, "/int signed long long"); 00085 r.alias(normalized_type_name, "/long signed long int"); 00086 r.alias(normalized_type_name, "/long long signed int"); 00087 r.alias(normalized_type_name, "/long long int signed"); 00088 r.alias(normalized_type_name, "/signed long long"); 00089 r.alias(normalized_type_name, "/long long signed"); 00090 r.alias(normalized_type_name, "/long signed long"); 00091 r.alias(normalized_type_name, "/long long int"); 00092 r.alias(normalized_type_name, "/long int long"); 00093 r.alias(normalized_type_name, "/int long long"); 00094 r.alias(normalized_type_name, "/long long"); 00095 normalized_type_name = "/uint" + boost::lexical_cast<std::string>(std::numeric_limits<long long>::digits + 1) + "_t"; 00096 r.alias(normalized_type_name, "/unsigned long long int"); 00097 r.alias(normalized_type_name, "/unsigned long int long"); 00098 r.alias(normalized_type_name, "/unsigned int long long"); 00099 r.alias(normalized_type_name, "/int unsigned long long"); 00100 r.alias(normalized_type_name, "/long unsigned long int"); 00101 r.alias(normalized_type_name, "/long long unsigned int"); 00102 r.alias(normalized_type_name, "/long long int unsigned"); 00103 r.alias(normalized_type_name, "/unsigned long long"); 00104 r.alias(normalized_type_name, "/long long unsigned"); 00105 r.alias(normalized_type_name, "/long unsigned long"); 00106 00107 BOOST_STATIC_ASSERT(( sizeof(float) == sizeof(int32_t) )); 00108 BOOST_STATIC_ASSERT(( sizeof(double) == sizeof(int64_t) )); 00109 r.add(new Numeric("/float", 4, Numeric::Float)); 00110 r.add(new Numeric("/double", 8, Numeric::Float)); 00111 00112 // Finally, add definition for boolean types 00113 r.add(new Numeric("/bool", sizeof(bool), Numeric::UInt)); 00114 } 00115 00116 00117 void Typelib::CXX::addStandardTypes(Typelib::Registry& registry) 00118 { 00119 if (!registry.has("/bool")) 00120 ::addStandardTypes(registry); 00121 if (!registry.has("/std/string")) 00122 registry.add(new String(registry)); 00123 } 00124