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
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
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