Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 1 | # format : |
| 2 | # $name = "regular_definition" |
| 3 | # "pattern" = "substitued_pattern" |
| 4 | # pattern can contain reference to regular definition with ${name} |
| 5 | # this occurence are substitued in pattern by their definition |
| 6 | |
| 7 | # regular_definition containing other regular_definition refer always to a |
| 8 | # previously defined regular definition so they can look like recursive but are |
| 9 | # not. op_regex.cpp do sucessive apply of pattern whilst change occur (with a |
| 10 | # hard limit on number of subsitutions) so you can apply successive change to |
| 11 | # translate first to an intermediate simplified form then continue substitution |
| 12 | # in another pattern (see iosfwd section). The number of grouping regexp is |
| 13 | # limited, see static const size_t max_match; in op_regex.h. Note than mangled |
| 14 | # name produce can be illegal as I choose to output like vector<type<T>> rather |
| 15 | # than vector<type<T> > |
| 16 | |
| 17 | # man regex is a friend, is it your ? |
| 18 | |
| 19 | $integer = "\<[0-9]+" |
| 20 | $identifier = "\<[_a-zA-Z][_a-zA-Z0-9]*" |
| 21 | $typename = "${identifier}(::${identifier})*" |
| 22 | $typename = "${typename}(<${typename}(, ${typename})*>)*" |
| 23 | # adding more substitution allow more nested templated type but we run out of |
| 24 | # \digit which is a wall. Indeed if you add more () grouping you need to |
| 25 | # rename all relevant \digit in pattern which use this regular definition |
| 26 | # $typename = "${typename}(<${typename}(, ${typename})*>)*" |
| 27 | # finally add standard C type not recognized by above patterns, the way to add |
| 28 | # pointer is ugly but we can't add any grouping to not overrun 9 max group |
| 29 | # in left pattern rules side.. |
| 30 | $typename = "(${typename}[ ]*\**|unsigned short[ ]**\**|unsigned int[ ]*\**|unsigned long[ ]*\**|unsigned char[ ]*\**|signed char[ ]*\**|long long[ ]*\**|unsigned long long[ ]*\**|long double[ ]*\**)" |
Jeff Brown | 7a33c86 | 2011-02-02 14:00:44 -0800 | [diff] [blame^] | 31 | $ptrdiff_t_type = "(int|long)" |
| 32 | |
Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 33 | |
| 34 | # FIXME: really discussable but simplify output and the next pattern. |
| 35 | "\<std::" = "" |
| 36 | " >" = ">" |
| 37 | # for these two we can't match begin of word. |
| 38 | "\{anonymous\}::" = "" |
| 39 | "\(anonymous namespace\)::" = "" |
| 40 | |
| 41 | # specific to gcc 2.95 |
| 42 | "\<basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0>>" = "string" |
| 43 | # two pass, first shrink allocator<> then less<> allowing map with user defined |
| 44 | # comparator |
| 45 | "\<(multi)?map<${typename}, ${typename}, ${typename}, allocator<\8>>" = "\1map<\2, \8, \e>" |
| 46 | "\<(multi)?map<${typename}, ${typename}, less<\2>>" = "\1map<\2, \8>" |
| 47 | |
| 48 | "\<bitset<(${integer}), unsigned long>" = "bitset<\1>" |
Jeff Brown | 7a33c86 | 2011-02-02 14:00:44 -0800 | [diff] [blame^] | 49 | "\<([io]stream_iterator)<char, ${ptrdiff_t_type}>" = "\1<char>" |
Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 50 | |
| 51 | # common to all supported gcc version. |
| 52 | "\<deque<${typename}, allocator<\1>, 0>" = "deque<\1>" |
| 53 | "\<(stack|queue)<${typename}, deque<\2>>" = "\1<\2>" |
| 54 | "\<(vector|list|deque)<${typename}, allocator<\2>>" = "\1<\2>" |
| 55 | # strictly speaking 3rd parameters is less<ContainerType::value_type> |
| 56 | "\<priority_queue<${typename}, vector<\1>, less<\1>>" = "priority_queue<\1>" |
| 57 | # two pass, first shrink allocator<> then less<> allowing map with user defined |
| 58 | # comparator |
| 59 | "\<(multi)?set<${typename}, ${typename}, allocator<\2>>" = "\1set<\2, \8>" |
| 60 | "\<(multi)?set<${typename}, less<\2>>" = "\1set<\2>" |
| 61 | |
| 62 | # get ride of _Rb_tree iterator typedef, these are also mapped by map/set but |
| 63 | # we can't distinguish a set<pair<int, int>>::iterator and a |
| 64 | # map<int, int>::iterator as they decay to an identical typedef so we don't try |
| 65 | # to be clever here. |
| 66 | "\<_Rb_tree_iterator<${typename}, \1 const[ ]*&, \1 const[ ]*\*>" = "_Rb_tree<\1>::const_iterator" |
| 67 | "\<_Rb_tree_iterator<${typename}, \1[ ]*&, \1[ ]*\*>" = "_Rb_tree<\1>::iterator" |
| 68 | # important special case for map/multimap iterator |
| 69 | "\<_Rb_tree_iterator<(pair<${typename} const, ${typename}>), \1 const[ ]*&, \1 const[ ]*\*>" = "_Rb_tree<\1>::const_iterator" |
| 70 | "\<_Rb_tree_iterator<(pair<${typename} const, ${typename}>), \1[ ]*&, \1[ ]*\*>" = "_Rb_tree<\1>::iterator" |
| 71 | # 2.95/3.2 set/multiset implementation |
| 72 | "\<_Rb_tree<${typename}, \1, _Identity<\1>, ${typename}, allocator<\1>>" = "_Rb_tree<\1, \1, _Identity<\1>, \7>" |
| 73 | "_Rb_tree<${typename}, \1, _Identity<\1>, less<\1>>" = "_Rb_tree<\1, \1, _Identity<\1>>" |
| 74 | # 2.95 map/multimap implementation |
| 75 | "\<_Rb_tree<${typename}, pair<\1 const, (${typename}( const)?)>, _Select1st<pair<\1 const, \7>>, less<\1>, allocator<\7>>" = "_Rb_tree<\1, pair<\1 const, \7>, _Select1st<pair<\1 const, \7>>, less<\1>>" |
| 76 | # 3.2 map/multimap implementation |
| 77 | "\<_Rb_tree<${typename}, pair<\1 const, ${typename}>, _Select1st<pair<\1 const, \7>>, less<\1>, allocator<pair<\1 const, \7>>>" = "_Rb_tree<\1, pair<\1 const, \7>, _Select1st<pair<\1 const, \7>>, less<\1>>" |
| 78 | # now we can shrink default comparator. |
| 79 | "\<_Rb_tree<${typename}, pair<\1 const, (${typename}( const)?)>, _Select1st<pair<\1 const, \7>>, less<\1>>" = "_Rb_tree<\1, pair<\1 const, \7>, _Select1st<pair<\1 const, \7>>>" |
| 80 | # get rid of _Select1st and _Identity |
| 81 | # FIXME: the presence od _Identity<> and _Select1st<> allowed to quickly |
| 82 | # differentiate a set or a map, the rule now to differentiate them is: |
| 83 | # second parameter to _Rb_tree* is a pair<> ==> map else set<>. Either we need |
| 84 | # to document this or remove _Identity and _Select1st pattern |
| 85 | "\<_Identity<${typename}>" = "\1" |
| 86 | "\<_Select1st<pair<${typename} const, ${typename}( const)?>>" = "\1 const" |
| 87 | |
| 88 | "\<_List_base<${typename}, allocator<\1>>" = "_List_base<\1>" |
| 89 | |
| 90 | # 2.95 templatized operator<< and >> exist only for std::string |
| 91 | "\<ostream & operator<<<char, string_char_traits<char>, __default_alloc_template<true, 0>>\(ostream &, string const &\)" = "ostream & operator<<(ostream &, string const &)" |
| 92 | "\<istream & (operator>>|getline)<char, string_char_traits<char>, __default_alloc_template<true, 0>>\(istream &, string &\)" = "istream & \1(istream &, string &)" |
| 93 | |
| 94 | # 3.0 templatized operator<< and >> exist only for std::string |
| 95 | "\<ostream& operator<< <char, char_traits<char>, allocator<char>>\(ostream&, string const&\)" = "ostream & operator<<(ostream &, string const &)" |
| 96 | "\<istream& (operator>>|getline) <char, char_traits<char>, allocator<char>>\(istream&, string&\)" = "istream & \1(istream &, string &)" |
| 97 | |
| 98 | # 2.95/3.2 algorithm |
| 99 | "\<(${typename}( const)?) \* find<\1 \*, ${typename}>\(\1 \*, \1 \*, \9 const &, ${typename}\)" = "\1 * find(\1 *, \1 *, \9 const &, \f)" |
| 100 | |
| 101 | "\<(${typename}( const)?) \* find_if<\1 \*, ${typename}>\(\1 \*, \1 \*, \9, random_access_iterator_tag)" = "\1 * find_if(\1 *, \1 *, \9, random_access_iterator_tag)" |
| 102 | |
| 103 | # gcc 3.2, not tested on 3.0, 3.1 but probably work. |
| 104 | # FIXME: there is a potential problem here with map<int const, long> |
| 105 | # the pair become pair<\2, \8> not pair<\2 const, \8>, who use the above, |
| 106 | # is it legal ? |
| 107 | # two pass, first shrink allocator<> then less<> allowing map with user defined |
| 108 | # comparator |
| 109 | "\<(multi)?map<${typename}, ${typename}, ${typename}, allocator<pair<\2 const, \8>>>" = "\1map<\2, \8, \e>" |
| 110 | # this one exist already for 2.95 the first transformation giving a common |
| 111 | # form for 2.95/3.2 |
| 112 | # "\<(multi)?map<${typename}, ${typename}, less<\2>>" = "\1map<\2, \8>" |
| 113 | |
Jeff Brown | 7a33c86 | 2011-02-02 14:00:44 -0800 | [diff] [blame^] | 114 | "\<bitset<\(unsigned( long)?\)(${integer})>" = "bitset<\2>" |
Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 115 | |
| 116 | # iterator |
Jeff Brown | 7a33c86 | 2011-02-02 14:00:44 -0800 | [diff] [blame^] | 117 | "\<iterator<(input|output|forward|bidirectional|random)_iterator_tag, ${typename}, (${ptrdiff_t_type}), \8\*, \8&>" = "iterator<\1_iterator_tag, \2>" |
| 118 | "\<([io]stream_iterator)<${typename}, char, char_traits<char>, ${ptrdiff_t_type}>" = "\1<\2>" |
Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 119 | |
| 120 | # __gnu_cxx::__normal_iterator are used in two context: basic_string<> and |
| 121 | # vector<T> we decay them to string::iterator, vector<T>::iterator |
| 122 | "\<__gnu_cxx::__normal_iterator<char const\*, string>" = "string::const_iterator" |
| 123 | "\<__gnu_cxx::__normal_iterator<char\*, string>" = "string::iterator" |
| 124 | "\<__gnu_cxx::__normal_iterator<wchar_t const\*, wstring>" = "wstring::const_iterator" |
| 125 | "\<__gnu_cxx::__normal_iterator<wchar_t\*, wstring>" = "wstring::iterator" |
| 126 | "\<__gnu_cxx::__normal_iterator<${typename} const\*, vector<\1>>" = "vector<\1>::const_iterator" |
| 127 | "\<__gnu_cxx::__normal_iterator<${typename}\*, vector<\1>>" = "vector<\1>::iterator" |
| 128 | |
| 129 | # 2.95 use only _List_iterator, 3.2 use also _List_iterator_base but since |
| 130 | # list::iterator is a typedef to _List_iterator we don't need to deal with |
| 131 | # _List_iterator_base |
| 132 | "\<_List_iterator<${typename}, \1[ ]*&, \1[ ]*\*>" = "list<\1>::iterator" |
| 133 | "\<_List_iterator<${typename}, \1 const[ ]*&, \1 const[ ]*\*>" = "list<\1>::const_iterator" |
| 134 | |
| 135 | # iosfwd, std::string and std::wstring |
| 136 | # first translate from "basic_xxx<T, char_traits<T>>" to "basic_xxx<T>" |
| 137 | "\<([io]streambuf_iterator|basic_(ios|streambuf|([io]|io)stream|filebuf|[io]?fstream))<${typename}, char_traits<\4>>" = "\1<\4>" |
| 138 | # as above translate from "basic_xxx<T, char_traits<T>, ...>" to "basic_xxx<T>" |
| 139 | "\<basic_(string(buf)?|[io]?stringstream)?<${typename}, char_traits<\3>, allocator<\3>>" = "basic_\1<\3>" |
| 140 | # now we can translate the two above for char, wchar_t to standardese typedef |
| 141 | $iosfwd_name = "\<basic_(string|ios|(stream|file|string)buf|(i|o|io)stream|[io]?(fstream|stringstream))" |
| 142 | "\<${iosfwd_name}<char>" = "\1" |
| 143 | "\<${iosfwd_name}<wchar_t>" = "w\1" |
| 144 | |
| 145 | # streampos and wstreampos decay to the same type, they are undistingushable |
| 146 | # in mangled name so substitute for the most probable, not a big deal |
| 147 | "\<fpos<__mbstate_t>" = "streampos" |
| 148 | |
| 149 | # locale |
| 150 | # strictly speaking this accept num_put<..., istream_iterator<...> > or |
| 151 | # num_get<..., ostream_iterator<...> > but this can't compile so no big deal |
| 152 | "\<(money|time|num)_(put|get)<${typename}, (i|o)streambuf_iterator<\3>>" = "\1_\2<\3>" |
| 153 | "\<moneypunct(_byname)?<${typename}, \(bool\)0>" = "moneypunct\1<\2>" |
| 154 | |
| 155 | # 3.2 algorithm |
| 156 | "\<(vector<${typename}>::(const_)?iterator) find<\1, ${typename}>\(\1, \1, \9 const&, ${typename}\)" = "\1 find(\1, \1, \9 const&, \f)" |
| 157 | |
| 158 | "\<((string|wstring)::(const_)?iterator) find<\1, ${typename}>\(\1, \1, \4 const&, ${typename}\)" = "\1 find(\1, \1, \4 const&, \a)" |
| 159 | |
| 160 | "\<(vector<${typename}>::(const_)?iterator) find_if<\1, ${typename}>\(\1, \1, \9, random_access_iterator_tag\)" = "\1 find_if(\1, \1, \9, random_access_iterator_tag)" |
| 161 | |
| 162 | "\<((string|wstring)::(const_)?iterator) find_if<\1, ${typename}>\(\1, \1, \4, random_access_iterator_tag\)" = "\1 find_if(\1, \1, \4, random_access_iterator_tag)" |