//===-------------------------- cxa_demangle.cpp --------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "cxa_demangle.h" #include #include #include #include #include #include #include #ifdef DEBUGGING #include #include #endif namespace __cxxabiv1 { namespace __libcxxabi { #pragma GCC visibility push(hidden) class __node { __node(const __node&); __node& operator=(const __node&); public: const char* __name_; size_t __size_; __node* __left_; __node* __right_; long double __value_; long __cached_size_; public: __node() : __name_(0), __size_(0), __left_(0), __right_(0), __cached_size_(-1) {} virtual ~__node() {}; void reset_cached_size() { __cached_size_ = -1; if (__left_) __left_->reset_cached_size(); if (__right_) __right_->reset_cached_size(); } virtual size_t first_size() const {return 0;} virtual size_t second_size() const {return 0;} virtual size_t size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = first_size() + second_size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const {return buf;} virtual char* second_demangled_name(char* buf) const {return buf;} virtual char* get_demangled_name(char* buf) const { return second_demangled_name(first_demangled_name(buf)); } virtual size_t base_size() const {return size();} virtual char* get_base_name(char* buf) const { return get_demangled_name(buf); } virtual ptrdiff_t print_base_name(char* f, char* l) const { return print(f, l); } virtual bool ends_with_template() const { return false; } virtual bool is_ctor_dtor_conv() const { return false; } virtual __node* base_name() const { return const_cast<__node*>(this); } virtual bool is_reference_or_pointer_to_function_or_array() const { return false; } virtual bool is_function() const { return false; } virtual bool is_cv_qualifer() const { return false; } virtual bool is_array() const { return false; } virtual bool fix_forward_references(__node**, __node**) { return true; } virtual __node* extract_cv(__node*&) const { return 0; } virtual size_t list_len() const { return 0; } virtual bool is_sub() const { return false; } virtual ptrdiff_t print(char* f, char* l) const { const ptrdiff_t sz1 = print_first(f, l); return sz1 + print_second(f+std::min(sz1, l-f), l); } virtual ptrdiff_t print_first(char*, char*) const { return 0; } virtual ptrdiff_t print_second(char*, char*) const { return 0; } }; #ifdef DEBUGGING void display(__node* x, int indent = 0) { if (x) { for (int i = 0; i < 2*indent; ++i) printf(" "); std::string buf(x->size(), '\0'); x->print(&buf.front(), &buf.back()+1); printf("%s %s, %p\n", typeid(*x).name(), buf.c_str(), x); display(x->__left_, indent+1); display(x->__right_, indent+1); } } #endif class __vtable : public __node { static const ptrdiff_t n = sizeof("vtable for ") - 1; public: __vtable(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "vtable for ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'v'; *f++ = 't'; *f++ = 'a'; *f++ = 'b'; *f++ = 'l'; *f++ = 'e'; *f++ = ' '; *f++ = 'f'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __VTT : public __node { static const ptrdiff_t n = sizeof("VTT for ") - 1; public: __VTT(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "VTT for ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'V'; *f++ = 'T'; *f++ = 'T'; *f++ = ' '; *f++ = 'f'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __typeinfo : public __node { static const ptrdiff_t n = sizeof("typeinfo for ") - 1; public: __typeinfo(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "typeinfo for ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 't'; *f++ = 'y'; *f++ = 'p'; *f++ = 'e'; *f++ = 'i'; *f++ = 'n'; *f++ = 'f'; *f++ = 'o'; *f++ = ' '; *f++ = 'f'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __typeinfo_name : public __node { static const ptrdiff_t n = sizeof("typeinfo name for ") - 1; public: __typeinfo_name(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "typeinfo name for ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 't'; *f++ = 'y'; *f++ = 'p'; *f++ = 'e'; *f++ = 'i'; *f++ = 'n'; *f++ = 'f'; *f++ = 'o'; *f++ = ' '; *f++ = 'n'; *f++ = 'a'; *f++ = 'm'; *f++ = 'e'; *f++ = ' '; *f++ = 'f'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __covariant_return_thunk : public __node { static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1; public: __covariant_return_thunk(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "covariant return thunk to ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'c'; *f++ = 'o'; *f++ = 'v'; *f++ = 'a'; *f++ = 'r'; *f++ = 'i'; *f++ = 'a'; *f++ = 'n'; *f++ = 't'; *f++ = ' '; *f++ = 'r'; *f++ = 'e'; *f++ = 't'; *f++ = 'u'; *f++ = 'r'; *f++ = 'n'; *f++ = ' '; *f++ = 't'; *f++ = 'h'; *f++ = 'u'; *f++ = 'n'; *f++ = 'k'; *f++ = ' '; *f++ = 't'; *f++ = 'o'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __virtual_thunk : public __node { static const size_t n = sizeof("virtual thunk to ") - 1; public: __virtual_thunk(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "virtual thunk to ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'v'; *f++ = 'i'; *f++ = 'r'; *f++ = 't'; *f++ = 'u'; *f++ = 'a'; *f++ = 'l'; *f++ = ' '; *f++ = 't'; *f++ = 'h'; *f++ = 'u'; *f++ = 'n'; *f++ = 'k'; *f++ = ' '; *f++ = 't'; *f++ = 'o'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __non_virtual_thunk : public __node { static const size_t n = sizeof("non-virtual thunk to ") - 1; public: __non_virtual_thunk(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "non-virtual thunk to ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'n'; *f++ = 'o'; *f++ = 'n'; *f++ = '-'; *f++ = 'v'; *f++ = 'i'; *f++ = 'r'; *f++ = 't'; *f++ = 'u'; *f++ = 'a'; *f++ = 'l'; *f++ = ' '; *f++ = 't'; *f++ = 'h'; *f++ = 'u'; *f++ = 'n'; *f++ = 'k'; *f++ = ' '; *f++ = 't'; *f++ = 'o'; *f = ' '; } return sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __guard_variable : public __node { static const size_t n = sizeof("guard variable for ") - 1; public: __guard_variable(__node* type) { __right_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "guard variable for ", n); return __right_->get_demangled_name(buf+n); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz = __right_->print(f+n, l) + n; if (r >= sz) { *f++ = 'g'; *f++ = 'u'; *f++ = 'a'; *f++ = 'r'; *f++ = 'd'; *f++ = ' '; *f++ = 'v'; *f++ = 'a'; *f++ = 'r'; *f++ = 'i'; *f++ = 'a'; *f++ = 'b'; *f++ = 'l'; *f++ = 'e'; *f++ = ' '; *f++ = 'f'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return sz; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __source_name : public __node { public: __source_name(const char* __name, unsigned __size) { __name_ = __name; __size_ = __size; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) const_cast(__cached_size_) = 21; else const_cast(__cached_size_) = __size_; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) return strncpy(buf, "(anonymous namespace)", 21) + 21; return strncpy(buf, __name_, __size_) + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) { const ptrdiff_t n = sizeof("(anonymous namespace)") - 1; if (r >= n) { *f++ = '('; *f++ = 'a'; *f++ = 'n'; *f++ = 'o'; *f++ = 'n'; *f++ = 'y'; *f++ = 'm'; *f++ = 'o'; *f++ = 'u'; *f++ = 's'; *f++ = ' '; *f++ = 'n'; *f++ = 'a'; *f++ = 'm'; *f++ = 'e'; *f++ = 's'; *f++ = 'p'; *f++ = 'a'; *f++ = 'c'; *f++ = 'e'; *f = ')'; } return n; } if (r >= __size_) strncpy(f, __name_, __size_); return __size_; } }; class __operator_new : public __node { public: virtual size_t first_size() const {return sizeof("operator new") - 1;} virtual char* first_demangled_name(char* buf) const { return strncpy(buf, "operator new", sizeof("operator new") - 1) + sizeof("operator new") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator new") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'n'; *f++ = 'e'; *f = 'w'; } return n; } }; class __operator_new_array : public __node { public: virtual size_t first_size() const {return sizeof("operator new[]") - 1;} virtual char* first_demangled_name(char* buf) const { return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) + sizeof("operator new[]") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator new[]") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'n'; *f++ = 'e'; *f++ = 'w'; *f++ = '['; *f = ']'; } return n; } }; class __operator_delete : public __node { public: virtual size_t first_size() const {return sizeof("operator delete") - 1;} virtual char* first_demangled_name(char* buf) const { return strncpy(buf, "operator delete", sizeof("operator delete") - 1) + sizeof("operator delete") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator delete") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'd'; *f++ = 'e'; *f++ = 'l'; *f++ = 'e'; *f++ = 't'; *f = 'e'; } return n; } }; class __operator_delete_array : public __node { public: virtual size_t first_size() const {return sizeof("operator delete[]") - 1;} virtual char* first_demangled_name(char* buf) const { return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) + sizeof("operator delete[]") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator delete[]") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'd'; *f++ = 'e'; *f++ = 'l'; *f++ = 'e'; *f++ = 't'; *f++ = 'e'; *f++ = '['; *f = ']'; } return n; } }; class __operator_logical_and : public __node { public: __operator_logical_and() {} __operator_logical_and(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator&&") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") && (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator&&", sizeof("operator&&") - 1); buf += sizeof("operator&&") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '&'; *f++ = '&'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator&&") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '&'; *f = '&'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_addressof : public __node { public: __operator_addressof() {} explicit __operator_addressof(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator&") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '&'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator&", sizeof("operator&") - 1); buf += sizeof("operator&") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '&'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator&") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '&'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_bit_and : public __node { public: __operator_bit_and() {} __operator_bit_and(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator&") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") & (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator&", sizeof("operator&") - 1); buf += sizeof("operator&") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '&'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator&") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '&'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_and_equal : public __node { public: __operator_and_equal() {} __operator_and_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator&=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") &= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator&=", sizeof("operator&=") - 1); buf += sizeof("operator&=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '&'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator&=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '&'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_equal : public __node { public: __operator_equal() {} __operator_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") = (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator=", sizeof("operator=") - 1); buf += sizeof("operator=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_alignof_type : public __node { public: __operator_alignof_type() {} __operator_alignof_type(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__right_) const_cast(__cached_size_) = __right_->size() + 10; else const_cast(__cached_size_) = sizeof("operator alignof") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__right_) { strncpy(buf, "alignof (", 9); buf += 9; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator alignof", sizeof("operator alignof") - 1); buf += sizeof("operator alignof") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__right_) { const ptrdiff_t n1 = sizeof("alignof ()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 'a'; *f++ = 'l'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'o'; *f++ = 'f'; *f++ = ' '; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator alignof") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'a'; *f++ = 'l'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'o'; *f = 'f'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__right_) return __right_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_alignof_expression : public __node { public: __operator_alignof_expression() {} __operator_alignof_expression(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__right_) const_cast(__cached_size_) = __right_->size() + 10; else const_cast(__cached_size_) = sizeof("operator alignof") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__right_) { strncpy(buf, "alignof (", 9); buf += 9; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator alignof", sizeof("operator alignof") - 1); buf += sizeof("operator alignof") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__right_) { const ptrdiff_t n1 = sizeof("alignof ()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 'a'; *f++ = 'l'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'o'; *f++ = 'f'; *f++ = ' '; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator alignof") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 'a'; *f++ = 'l'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'o'; *f = 'f'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__right_) return __right_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_paren : public __node { public: virtual size_t first_size() const {return sizeof("operator()") - 1;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "operator()", sizeof("operator()") - 1); return buf + sizeof("operator()") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator()") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '('; *f = ')'; } return n; } }; class __operator_comma : public __node { public: __operator_comma() {} __operator_comma(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator,") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") , (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator,", sizeof("operator,") - 1); buf += sizeof("operator,") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = ','; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator,") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = ','; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_tilda : public __node { public: __operator_tilda() {} explicit __operator_tilda(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator~") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '~'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator~", sizeof("operator~") - 1); buf += sizeof("operator~") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '~'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator~") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '~'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_cast : public __node { static const size_t n = sizeof("operator ") - 1; public: explicit __operator_cast(__node* type) { __right_ = type; } __operator_cast(__node* type, __node* arg) { __size_ = 1; __right_ = type; __left_ = arg; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t off; if (__size_) { off = 4; off += __right_->size(); if (__left_) off += __left_->size(); } else off = n + __right_->size();; const_cast(__cached_size_) = off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_) { *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; *buf++ = '('; if (__left_) buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator ", n); buf = __right_->get_demangled_name(buf+n); } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__size_) { const ptrdiff_t n1 = 4; if (r < n1) return n1 + __right_->print(l, l) + (__left_ ? __left_->print(l, l) : 0); ptrdiff_t sz1 = __right_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + (__left_ ? __left_->print(l, l) : 0); ptrdiff_t sz2 = __left_ ? __left_->print(f+3+sz1, l) : 0; if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator ") - 1; if (r < n2) return n2 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+n2, l); if (r >= n2 + sz1) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = ' '; } return n2 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); r = r && __right_->fix_forward_references(t_begin, t_end); return r; } virtual bool is_ctor_dtor_conv() const { return true; } }; class __cast_literal : public __node { public: __cast_literal(__node* type, const char* f, const char* l) { __left_ = type; __name_ = f; __size_ = l - f; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = 2 + __left_->size() + __size_; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 2; if (r < __size_ + n) return __size_ + n + __left_->print(l, l); ptrdiff_t sz = __left_->print(f+1, l); if (r >= __size_ + n + sz) { *f = '('; f += 1 + sz; *f++ = ')'; strncpy(f, __name_, __size_); } return __size_ + n + sz; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } }; class __operator_dereference : public __node { public: __operator_dereference() {} explicit __operator_dereference(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator*") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '*'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator*", sizeof("operator*") - 1); buf += sizeof("operator*") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '*'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator*") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '*'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_divide : public __node { public: __operator_divide() {} __operator_divide(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator/") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") / (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator/", sizeof("operator/") - 1); buf += sizeof("operator/") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '/'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator/") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '/'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_divide_equal : public __node { public: __operator_divide_equal() {} __operator_divide_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator/=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") /= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator/=", sizeof("operator/=") - 1); buf += sizeof("operator/=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '/'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator/=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '/'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_xor : public __node { public: __operator_xor() {} __operator_xor(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator^") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") ^ (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator^", sizeof("operator^") - 1); buf += sizeof("operator^") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '^'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator^") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '^'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_xor_equal : public __node { public: __operator_xor_equal() {} __operator_xor_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator^=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; // strncpy(buf, "(", 1); buf = __left_->get_demangled_name(buf); strncpy(buf, ") ^= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator^=", sizeof("operator^=") - 1); buf += sizeof("operator^=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '^'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator^=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '^'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_equality : public __node { public: __operator_equality() {} __operator_equality(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator==") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") == (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator==", sizeof("operator==") - 1); buf += sizeof("operator==") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '='; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator==") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '='; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_greater_equal : public __node { public: __operator_greater_equal() {} __operator_greater_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator>=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") >= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator>=", sizeof("operator>=") - 1); buf += sizeof("operator>=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '>'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator>=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '>'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_greater : public __node { public: __operator_greater() {} __operator_greater(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 9 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator>") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") > (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; *buf++ = ')'; } else { strncpy(buf, "operator>", sizeof("operator>") - 1); buf += sizeof("operator>") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 9; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-2)+sz1, l); if (r >= n1 + sz1 + sz2) { *f++ = '('; *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '>'; *f++ = ' '; *f = '('; f += 1 + sz2; *f++ = ')'; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator>") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '>'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_brackets : public __node { public: virtual size_t first_size() const {return sizeof("operator[]") - 1;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "operator[]", sizeof("operator[]") - 1); return buf + sizeof("operator[]") - 1; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("operator[]") - 1; if (r >= n) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '['; *f = ']'; } return n; } }; class __operator_less_equal : public __node { public: __operator_less_equal() {} __operator_less_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator<=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") <= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator<=", sizeof("operator<=") - 1); buf += sizeof("operator<=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '<'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator<=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '<'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_less : public __node { public: __operator_less() {} __operator_less(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator<") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") < (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator<", sizeof("operator<") - 1); buf += sizeof("operator<") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '<'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator<") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '<'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_left_shift : public __node { public: __operator_left_shift() {} __operator_left_shift(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator<<") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") << (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator<<", sizeof("operator<<") - 1); buf += sizeof("operator<<") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '<'; *f++ = '<'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator<<") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '<'; *f = '<'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_left_shift_equal : public __node { public: __operator_left_shift_equal() {} __operator_left_shift_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 9 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator<<=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") <<= (", 7); buf += 7; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator<<=", sizeof("operator<<=") - 1); buf += sizeof("operator<<=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 9; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '<'; *f++ = '<'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator<<=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '<'; *f++ = '<'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_minus : public __node { public: __operator_minus() {} __operator_minus(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator-") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") - (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator-", sizeof("operator-") - 1); buf += sizeof("operator-") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '-'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator-") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '-'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_minus_equal : public __node { public: __operator_minus_equal() {} __operator_minus_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator-=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") -= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator-=", sizeof("operator-=") - 1); buf += sizeof("operator-=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '-'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator-=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '-'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_times : public __node { public: __operator_times() {} __operator_times(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator*") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") * (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator*", sizeof("operator*") - 1); buf += sizeof("operator*") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '*'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator*") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '*'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_times_equal : public __node { public: __operator_times_equal() {} __operator_times_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator*=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") *= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator*=", sizeof("operator*=") - 1); buf += sizeof("operator*=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '*'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator*=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '*'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_decrement : public __node { public: __operator_decrement() {} explicit __operator_decrement(bool prefix, __node* op) { __size_ = prefix; __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 4+__left_->size(); else const_cast(__cached_size_) = sizeof("operator--") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { if (__size_) { *buf++ = '-'; *buf++ = '-'; *buf++ = '('; } else *buf++ = '('; buf = __left_->get_demangled_name(buf); if (__size_) *buf++ = ')'; else { *buf++ = ')'; *buf++ = '-'; *buf++ = '-'; } } else { strncpy(buf, "operator--", sizeof("operator--") - 1); buf += sizeof("operator--") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 4; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l); if (r >= n1 + sz1) { if (__size_) { *f++ = '-'; *f++ = '-'; *f = '('; f += 1+sz1; *f = ')'; } else { *f = '('; f += 1+sz1; *f++ = ')'; *f++ = '-'; *f = '-'; } } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator--") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '-'; *f = '-'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_not_equal : public __node { public: __operator_not_equal() {} __operator_not_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator!=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") != (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator!=", sizeof("operator!=") - 1); buf += sizeof("operator!=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '!'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator!=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '!'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_negate : public __node { public: __operator_negate() {} explicit __operator_negate(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator-") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '-'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator-", sizeof("operator-") - 1); buf += sizeof("operator-") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '-'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator-") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '-'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_logical_not : public __node { public: __operator_logical_not() {} explicit __operator_logical_not(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator!") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '!'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator!", sizeof("operator!") - 1); buf += sizeof("operator!") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '!'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator!") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '!'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_logical_or : public __node { public: __operator_logical_or() {} __operator_logical_or(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator||") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") || (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator||", sizeof("operator||") - 1); buf += sizeof("operator||") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '|'; *f++ = '|'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator||") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '|'; *f = '|'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_bit_or : public __node { public: __operator_bit_or() {} __operator_bit_or(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator|") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") | (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator|", sizeof("operator|") - 1); buf += sizeof("operator|") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '|'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator|") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '|'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_or_equal : public __node { public: __operator_or_equal() {} __operator_or_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator|=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") |= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator|=", sizeof("operator|=") - 1); buf += sizeof("operator|=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '|'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator|=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '|'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_pointer_to_member : public __node { public: __operator_pointer_to_member() {} __operator_pointer_to_member(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 9 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator->*") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") ->* (", 7); buf += 7; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator->*", sizeof("operator->*") - 1); buf += sizeof("operator->*") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 9; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '-'; *f++ = '>'; *f++ = '*'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator->*") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '-'; *f++ = '>'; *f = '*'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_plus : public __node { public: __operator_plus() {} __operator_plus(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator+") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") + (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator+", sizeof("operator+") - 1); buf += sizeof("operator+") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '+'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator+") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '+'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_plus_equal : public __node { public: __operator_plus_equal() {} __operator_plus_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator+=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") += (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator+=", sizeof("operator+=") - 1); buf += sizeof("operator+=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '+'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator+=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '+'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_increment : public __node { public: __operator_increment() {} explicit __operator_increment(bool prefix, __node* op) { __size_ = prefix; __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 4+__left_->size(); else const_cast(__cached_size_) = sizeof("operator++") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { if (__size_) { *buf++ = '+'; *buf++ = '+'; *buf++ = '('; } else *buf++ = '('; buf = __left_->get_demangled_name(buf); if (__size_) *buf++ = ')'; else { *buf++ = ')'; *buf++ = '+'; *buf++ = '+'; } } else { strncpy(buf, "operator++", sizeof("operator++") - 1); buf += sizeof("operator++") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 4; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l); if (r >= n1 + sz1) { if (__size_) { *f++ = '+'; *f++ = '+'; *f = '('; f += 1+sz1; *f = ')'; } else { *f = '('; f += 1+sz1; *f++ = ')'; *f++ = '+'; *f = '+'; } } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator++") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '+'; *f = '+'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_unary_plus : public __node { public: __operator_unary_plus() {} explicit __operator_unary_plus(__node* op) { __left_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = 3+__left_->size(); else const_cast(__cached_size_) = sizeof("operator+") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '+'; *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator+", sizeof("operator+") - 1); buf += sizeof("operator+") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 3; if (r < n1) return n1 + __left_->print(l, l); ptrdiff_t sz1 = __left_->print(f+2, l); if (r >= n1 + sz1) { *f++ = '+'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator+") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '+'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_) return __left_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_arrow : public __node { public: __operator_arrow() {} __operator_arrow(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator->") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") -> (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator->", sizeof("operator->") - 1); buf += sizeof("operator->") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '-'; *f++ = '>'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator->") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '-'; *f = '>'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_conditional : public __node { public: __operator_conditional() {} __operator_conditional(__node* op1, __node* op2, __node* op3) { __name_ = (const char*)op1; __left_ = op2; __right_ = op3; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) { __node* op1 = (__node*)__name_; const_cast(__cached_size_) = op1->size() + __left_->size() + 12 + __right_->size(); } else const_cast(__cached_size_) = sizeof("operator?") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { __node* op1 = (__node*)__name_; *buf++ = '('; buf = op1->get_demangled_name(buf); strncpy(buf, ") ? (", 5); buf += 5; buf = __left_->get_demangled_name(buf); strncpy(buf, ") : (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator?", sizeof("operator?") - 1); buf += sizeof("operator?") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 12; __node* op1 = (__node*)__name_; if (r < n1) return n1 + op1->print(l, l) + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = op1->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz2 = __left_->print(f+6+sz1, l); if (r < n1 + sz1 + sz2) return n1 + sz1 + sz2 + __right_->print(l, l); ptrdiff_t sz3 = __right_->print(f+11+sz1+sz2, l); if (r >= n1 + sz1 + sz2 + sz3) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '?'; *f++ = ' '; *f = '('; f += 1 + sz2; *f++ = ')'; *f++ = ' '; *f++ = ':'; *f++ = ' '; *f = '('; f += 1 + sz3; *f = ')'; } return n1 + sz1 + sz2 + sz3; } const ptrdiff_t n2 = sizeof("operator?") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '?'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__name_) r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end); if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_mod : public __node { public: __operator_mod() {} __operator_mod(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 7 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator%") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") % (", 5); buf += 5; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator%", sizeof("operator%") - 1); buf += sizeof("operator%") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 7; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '%'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator%") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f = '%'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_mod_equal : public __node { public: __operator_mod_equal() {} __operator_mod_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator%=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") %= (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator%=", sizeof("operator%=") - 1); buf += sizeof("operator%=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '%'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator%=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '%'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_right_shift : public __node { public: __operator_right_shift() {} __operator_right_shift(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 8 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator>>") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") >> (", 6); buf += 6; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator>>", sizeof("operator>>") - 1); buf += sizeof("operator>>") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 8; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '>'; *f++ = '>'; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator>>") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '>'; *f = '>'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_right_shift_equal : public __node { public: __operator_right_shift_equal() {} __operator_right_shift_equal(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_) const_cast(__cached_size_) = __left_->size() + 9 + __right_->size(); else const_cast(__cached_size_) = sizeof("operator>>=") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); strncpy(buf, ") >>= (", 7); buf += 7; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator>>=", sizeof("operator>>=") - 1); buf += sizeof("operator>>=") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__left_) { const ptrdiff_t n1 = 9; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+1, l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); if (r >= n1 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f++ = ')'; *f++ = ' '; *f++ = '>'; *f++ = '>'; *f++ = '='; *f++ = ' '; *f = '('; f += 1 + sz2; *f = ')'; } return n1 + sz1 + sz2; } const ptrdiff_t n2 = sizeof("operator>>=") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = '>'; *f++ = '>'; *f = '='; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __operator_sizeof_type : public __node { public: __operator_sizeof_type() {} __operator_sizeof_type(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__right_) const_cast(__cached_size_) = __right_->size() + 9; else const_cast(__cached_size_) = sizeof("operator sizeof") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__right_) { strncpy(buf, "sizeof (", 8); buf += 8; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1); buf += sizeof("operator sizeof") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__right_) { const ptrdiff_t n1 = sizeof("sizeof ()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 's'; *f++ = 'i'; *f++ = 'z'; *f++ = 'e'; *f++ = 'o'; *f++ = 'f'; *f++ = ' '; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator sizeof") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 's'; *f++ = 'i'; *f++ = 'z'; *f++ = 'e'; *f++ = 'o'; *f = 'f'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__right_) return __right_->fix_forward_references(t_begin, t_end); return true; } }; class __operator_sizeof_expression : public __node { public: __operator_sizeof_expression() {} __operator_sizeof_expression(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) { if (__right_) const_cast(__cached_size_) = __right_->size() + 9; else const_cast(__cached_size_) = sizeof("operator sizeof") - 1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__right_) { strncpy(buf, "sizeof (", 8); buf += 8; buf = __right_->get_demangled_name(buf); *buf++ = ')'; } else { strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1); buf += sizeof("operator sizeof") - 1; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__right_) { const ptrdiff_t n1 = sizeof("sizeof ()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 's'; *f++ = 'i'; *f++ = 'z'; *f++ = 'e'; *f++ = 'o'; *f++ = 'f'; *f++ = ' '; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } const ptrdiff_t n2 = sizeof("operator sizeof") - 1; if (r >= n2) { *f++ = 'o'; *f++ = 'p'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f++ = 'r'; *f++ = ' '; *f++ = 's'; *f++ = 'i'; *f++ = 'z'; *f++ = 'e'; *f++ = 'o'; *f = 'f'; } return n2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__right_) return __right_->fix_forward_references(t_begin, t_end); return true; } }; class __typeid : public __node { public: __typeid(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __right_->size() + 8; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "typeid(", 7); buf += 7; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("typeid()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 't'; *f++ = 'y'; *f++ = 'p'; *f++ = 'e'; *f++ = 'i'; *f++ = 'd'; *f = '('; f += 1 + sz1; *f = ')'; } return n1 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __throw : public __node { public: __throw(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __right_->size() + 6; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "throw ", 6); return __right_->get_demangled_name(buf+6); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("throw ") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+n1, l); if (r >= n1 + sz1) { *f++ = 't'; *f++ = 'h'; *f++ = 'r'; *f++ = 'o'; *f++ = 'w'; *f = ' '; } return n1 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __rethrow : public __node { static const ptrdiff_t n = sizeof("throw") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "throw", n); return buf+n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 't'; *f++ = 'h'; *f++ = 'r'; *f++ = 'o'; *f = 'w'; } return n; } }; class __operator_sizeof_param_pack : public __node { public: __operator_sizeof_param_pack(__node* op) { __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __right_->size() + 11; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "sizeof...(", 10); buf += 10; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("sizeof...()") - 1; if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+(n1-1), l); if (r >= n1 + sz1) { *f++ = 's'; *f++ = 'i'; *f++ = 'z'; *f++ = 'e'; *f++ = 'o'; *f++ = 'f'; *f++ = '.'; *f++ = '.'; *f++ = '.'; *f = '('; f += 1+sz1; *f = ')'; } return n1 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __const_cast : public __node { public: __const_cast(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 14 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "const_cast<", 11); buf += 11; buf = __left_->get_demangled_name(buf); *buf++ = '>'; *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("const_cast<>()") - 1; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+(n1-3), l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); if (r >= n1 + sz1 + sz2) { *f++ = 'c'; *f++ = 'o'; *f++ = 'n'; *f++ = 's'; *f++ = 't'; *f++ = '_'; *f++ = 'c'; *f++ = 'a'; *f++ = 's'; *f++ = 't'; *f = '<'; f += 1+sz1; *f++ = '>'; *f = '('; f += 1+sz2; *f = ')'; } return n1 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __dynamic_cast : public __node { public: __dynamic_cast(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 16 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "dynamic_cast<", 13); buf += 13; buf = __left_->get_demangled_name(buf); *buf++ = '>'; *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("dynamic_cast<>()") - 1; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+(n1-3), l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); if (r >= n1 + sz1 + sz2) { *f++ = 'd'; *f++ = 'y'; *f++ = 'n'; *f++ = 'a'; *f++ = 'm'; *f++ = 'i'; *f++ = 'c'; *f++ = '_'; *f++ = 'c'; *f++ = 'a'; *f++ = 's'; *f++ = 't'; *f = '<'; f += 1+sz1; *f++ = '>'; *f = '('; f += 1+sz2; *f = ')'; } return n1 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __reinterpret_cast : public __node { public: __reinterpret_cast(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 20 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "reinterpret_cast<", 17); buf += 17; buf = __left_->get_demangled_name(buf); *buf++ = '>'; *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("reinterpret_cast<>()") - 1; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+(n1-3), l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); if (r >= n1 + sz1 + sz2) { *f++ = 'r'; *f++ = 'e'; *f++ = 'i'; *f++ = 'n'; *f++ = 't'; *f++ = 'e'; *f++ = 'r'; *f++ = 'p'; *f++ = 'r'; *f++ = 'e'; *f++ = 't'; *f++ = '_'; *f++ = 'c'; *f++ = 'a'; *f++ = 's'; *f++ = 't'; *f = '<'; f += 1+sz1; *f++ = '>'; *f = '('; f += 1+sz2; *f = ')'; } return n1 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __static_cast : public __node { public: __static_cast(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 15 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "static_cast<", 12); buf += 12; buf = __left_->get_demangled_name(buf); *buf++ = '>'; *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("static_cast<>()") - 1; if (r < n1) return n1 + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f+(n1-3), l); if (r < n1 + sz1) return n1 + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); if (r >= n1 + sz1 + sz2) { *f++ = 's'; *f++ = 't'; *f++ = 'a'; *f++ = 't'; *f++ = 'i'; *f++ = 'c'; *f++ = '_'; *f++ = 'c'; *f++ = 'a'; *f++ = 's'; *f++ = 't'; *f = '<'; f += 1+sz1; *f++ = '>'; *f = '('; f += 1+sz2; *f = ')'; } return n1 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __call_expr : public __node { public: __call_expr(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t off = __left_->size() + 2; if (__right_) off += __right_->size(); const_cast(__cached_size_) = off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = '('; if (__right_) buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("()") - 1; if (r < n1) return n1 + __left_->print(l, l) + (__right_ ? __right_->print(l, l) : 0); ptrdiff_t sz1 = __left_->print(f, l); if (r < n1 + sz1) return n1 + sz1 + (__right_ ? __right_->print(l, l) : 0); ptrdiff_t sz2 = __right_ ? __right_->print(f+sz1+1, l) : 0; if (r >= n1 + sz1 + sz2) { f += sz1; *f = '('; f += 1+sz2; *f = ')'; } return n1 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __delete_array_expr : public __node { public: __delete_array_expr(bool global, __node* op) { __size_ = global; __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = (__size_ ? 2 : 0) + 9 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_) { *buf++ = ':'; *buf++ = ':'; } strncpy(buf, "delete[] ", 9); return __right_->get_demangled_name(buf+9); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("delete[] ") - 1 + (__size_ ? 2 : 0); if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+n1, l); if (r >= n1 + sz1) { if (__size_) { *f++ = ':'; *f++ = ':'; } *f++ = 'd'; *f++ = 'e'; *f++ = 'l'; *f++ = 'e'; *f++ = 't'; *f++ = 'e'; *f++ = '['; *f++ = ']'; *f = ' '; } return n1 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __delete_expr : public __node { public: __delete_expr(bool global, __node* op) { __size_ = global; __right_ = op; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = (__size_ ? 2 : 0) + 7 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_) { *buf++ = ':'; *buf++ = ':'; } strncpy(buf, "delete ", 7); return __right_->get_demangled_name(buf+7); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("delete ") - 1 + (__size_ ? 2 : 0); if (r < n1) return n1 + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+n1, l); if (r >= n1 + sz1) { if (__size_) { *f++ = ':'; *f++ = ':'; } *f++ = 'd'; *f++ = 'e'; *f++ = 'l'; *f++ = 'e'; *f++ = 't'; *f++ = 'e'; *f = ' '; } return n1 + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __new_expr : public __node { public: __new_expr(bool global, bool is_array, bool has_init, __node* expr, __node* type, __node* init) { __size_ = (unsigned)global | ((unsigned)is_array << 1) | ((unsigned)has_init << 2); __left_ = expr; __name_ = (const char*)type; __right_ = init; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t off = 4; if (__size_ & 1) off += 2; if (__size_ & 2) off += 2; if (__left_) { off += 2; off += __left_->size(); } __node* type = (__node*)__name_; off += type->size(); if (__size_ & 4) { off += 2; if (__right_) off += __right_->size(); } const_cast(__cached_size_) = off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_ & 1) { *buf++ = ':'; *buf++ = ':'; } *buf++ = 'n'; *buf++ = 'e'; *buf++ = 'w'; if (__size_ & 2) { *buf++ = '['; *buf++ = ']'; } if (__left_) { *buf++ = '('; buf = __left_->get_demangled_name(buf); *buf++ = ')'; } *buf++ = ' '; __node* type = (__node*)__name_; buf = type->get_demangled_name(buf); if (__size_ & 4) { *buf++ = '('; if (__right_) buf = __right_->get_demangled_name(buf); *buf++ = ')'; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n1 = sizeof("new ") - 1 + (__size_ & 1 ? 2 : 0) + (__size_ & 2 ? 2 : 0) + (__left_ ? 2 : 0) + (__size_ & 4 ? 2 : 0); __node* type = (__node*)__name_; if (r < n1) return n1 + (__left_ ? __left_->print(l, l) : 0) + type->print(l, l) + (__right_ ? __right_->print(l, l) : 0); ptrdiff_t sz1 = __left_ ? __left_->print(f+4+ (__size_ & 1 ? 2 : 0) + (__size_ & 2 ? 2 : 0), l) : 0; if (r < n1 + sz1) return n1 + sz1 + type->print(l, l) + (__right_ ? __right_->print(l, l) : 0); ptrdiff_t sz2 = type->print(f+(n1-(__size_ & 4 ? 2 : 0)+sz1), l); if (r < n1 + sz1 + sz2) return n1 + sz1 + sz2 + (__right_ ? __right_->print(l, l) : 0); ptrdiff_t sz3 = __right_ ? __right_->print(f+(n1-1)+sz1+sz2, l) : 0; if (r >= n1 + sz1 + sz2 + sz3) { if (__size_ & 1) { *f++ = ':'; *f++ = ':'; } *f++ = 'n'; *f++ = 'e'; *f++ = 'w'; if (__size_ & 2) { *f++ = '['; *f++ = ']'; } if (__left_) { *f = '('; f += 1 + sz1; *f++ = ')'; } *f = ' '; if (__size_ & 4) { f += 1 + sz2; *f = '('; f += 1 + sz3; *f = ')'; } } return n1 + sz1 + sz2 + sz3; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { __node* type = (__node*)__name_; bool r = type->fix_forward_references(t_begin, t_end); if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end);; if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end);; return r; } }; class __dot_star_expr : public __node { public: __dot_star_expr(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 2 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = '.'; *buf++ = '*'; return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof(".*") - 1; if (r < n) return n + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f, l); if (r < n + sz1) return n + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+n, l); if (r >= n + sz1 + sz2) { f += sz1; *f++ = '.'; *f = '*'; } return n + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __dot_expr : public __node { public: __dot_expr(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 1 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = '.'; return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof(".") - 1; if (r < n) return n + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f, l); if (r < n + sz1) return n + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+n, l); if (r >= n + sz1 + sz2) f[sz1] = '.'; return n + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __arrow_expr : public __node { public: __arrow_expr(__node* op1, __node* op2) { __left_ = op1; __right_ = op2; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 2 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = '-'; *buf++ = '>'; return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("->") - 1; if (r < n) return n + __left_->print(l, l) + __right_->print(l, l); ptrdiff_t sz1 = __left_->print(f, l); if (r < n + sz1) return n + sz1 + __right_->print(l, l); ptrdiff_t sz2 = __right_->print(f+sz1+n, l); if (r >= n + sz1 + sz2) { f += sz1; *f++ = '-'; *f = '>'; } return n + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __std_qualified_name : public __node { static const ptrdiff_t n = sizeof("std") - 1; public: __std_qualified_name() { } virtual size_t first_size() const { return n; } virtual char* first_demangled_name(char* buf) const { *buf++ = 's'; *buf++ = 't'; *buf++ = 'd'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f = 'd'; } return n; } }; class __sub_allocator : public __node { static const ptrdiff_t n = sizeof("std::allocator") - 1; public: virtual size_t first_size() const { return n; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::allocator", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'a'; *f++ = 'l'; *f++ = 'l'; *f++ = 'o'; *f++ = 'c'; *f++ = 'a'; *f++ = 't'; *f++ = 'o'; *f = 'r'; } return n; } }; class __sub_basic_string : public __node { static const ptrdiff_t n = sizeof("std::basic_string") - 1; public: virtual size_t first_size() const { return n; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::basic_string", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'b'; *f++ = 'a'; *f++ = 's'; *f++ = 'i'; *f++ = 'c'; *f++ = '_'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'i'; *f++ = 'n'; *f = 'g'; } return n; } }; class __sub_string : public __node { static const size_t n = sizeof("std::string") - 1; static const size_t ne = sizeof("std::basic_string, std::allocator >") - 1; public: virtual size_t first_size() const { if (__size_) return ne; return n; } virtual char* first_demangled_name(char* buf) const { if (__size_) { strncpy(buf, "std::basic_string, std::allocator >", ne); buf += ne; } else { strncpy(buf, "std::string", n); buf += n; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (__size_) { const ptrdiff_t n1 = sizeof("std::basic_string," " std::allocator >") - 1; if (r >= n1) strncpy(f, "std::basic_string," " std::allocator >", n1); return n1; } const ptrdiff_t n2 = sizeof("std::string") - 1; if (r >= n2) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'i'; *f++ = 'n'; *f = 'g'; } return n2; } virtual size_t base_size() const { return 12; } virtual char* get_base_name(char* buf) const { strncpy(buf, "basic_string", 12); return buf + 12; } virtual ptrdiff_t print_base_name(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("basic_string") - 1; if (r >= n) { *f++ = 'b'; *f++ = 'a'; *f++ = 's'; *f++ = 'i'; *f++ = 'c'; *f++ = '_'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'i'; *f++ = 'n'; *f = 'g'; } return n; } virtual __node* base_name() const { const_cast(__size_) = true; return const_cast<__node*>(static_cast(this)); } }; class __sub_istream : public __node { static const ptrdiff_t n = sizeof("std::istream") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::istream", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'i'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'e'; *f++ = 'a'; *f = 'm'; } return n; } }; class __sub_ostream : public __node { static const ptrdiff_t n = sizeof("std::ostream") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::ostream", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'o'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'e'; *f++ = 'a'; *f = 'm'; } return n; } }; class __sub_iostream : public __node { static const ptrdiff_t n = sizeof("std::iostream") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::iostream", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'i'; *f++ = 'o'; *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'e'; *f++ = 'a'; *f = 'm'; } return n; } }; class __sub : public __node { public: explicit __sub(__node* arg) { __left_ = arg; } explicit __sub(size_t arg) { __size_ = arg; } virtual size_t first_size() const { return __left_->first_size(); } virtual char* first_demangled_name(char* buf) const { return __left_->first_demangled_name(buf); } virtual size_t second_size() const { return __left_->second_size(); } virtual char* second_demangled_name(char* buf) const { return __left_->second_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { return __left_->print_first(f, l); } virtual ptrdiff_t print_second(char* f, char* l) const { return __left_->print_second(f, l); } virtual bool ends_with_template() const { return __left_->ends_with_template(); } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_reference_or_pointer_to_function_or_array(); } virtual bool is_function() const { return __left_->is_function(); } virtual bool is_cv_qualifer() const { return __left_->is_cv_qualifer(); } virtual bool is_ctor_dtor_conv() const { return __left_->is_ctor_dtor_conv(); } virtual bool is_array() const { return __left_->is_array(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { if (__left_ == 0) { if (__size_ < t_end - t_begin) { __left_ = t_begin[__size_]; __size_ = 0; } else return false; } return true; } virtual size_t list_len() const { return __left_->list_len(); } virtual bool is_sub() const { return true; } }; class __unscoped_template_name : public __node { public: __unscoped_template_name(__node* name, __node* args) {__left_ = name; __right_ = args;} virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t sz1 = __left_->print(f, l); if (r < sz1) return sz1 + __right_->print(l, l); return sz1 + __right_->print(f + sz1, l); } virtual bool ends_with_template() const { return __right_->ends_with_template(); } virtual __node* base_name() const { return __left_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; // length == 0: __left_ == NULL // length == 1: __left_ != NULL, __right_ == NULL // length > 1: __left_ != NULL, __right_ != NULL class __list : public __node { public: explicit __list(__node* type) {__left_ = type;} virtual size_t first_size() const { if (__cached_size_ == -1) { if (__left_ == NULL) const_cast(__cached_size_) = 0; else if (__right_ == NULL) const_cast(__cached_size_) = __left_->size(); else { size_t off = __right_->size(); if (off > 0) off += 2; const_cast(__cached_size_) = __left_->size() + off; } } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__left_ != NULL) { char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0)); if (__size_ == 0) buf = t; else if (t != buf+2) { *buf++ = ','; *buf++ = ' '; buf = t; } if (__right_) buf = __right_->get_demangled_name(buf); } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { if (__left_ == 0) return 0; const ptrdiff_t r = l - f; ptrdiff_t n = 0; if (__size_) { n = 2; if (r < n) { ptrdiff_t sz1 = __left_->print(l, l); if (sz1 == 0) n = 0; return n + sz1 + (__right_ ? __right_->print(l, l) : 0); } } const ptrdiff_t sz1 = __left_->print(f+n, l); if (sz1 == 0) n = 0; else if (n != 0) { f[0] = ','; f[1] = ' '; } const ptrdiff_t sz2 = __right_ ? __right_->print(f+std::min(n+sz1, r), l) : 0; return n + sz1 + sz2; } virtual bool ends_with_template() const { if (__right_ != NULL) return __right_->ends_with_template(); if (__left_ != NULL) return __left_->ends_with_template(); return false; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } virtual size_t list_len() const { if (!__left_) return 0; if (!__right_) return 1; return 1 + __right_->list_len(); } }; class __template_args : public __node { public: __template_args(__node* name, __node* list) { __left_ = name; __right_ = list; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t off = 2; if (__right_) { if (__right_->ends_with_template()) ++off; off += __right_->size(); } const_cast(__cached_size_) = __left_->size() + off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = '<'; if (__right_) { buf = __right_->get_demangled_name(buf); if (buf[-1] == '>') *buf++ = ' '; } *buf++ = '>'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz1 = __left_->print(f, l); ptrdiff_t sz2 = 0; ptrdiff_t n = 2; if (__right_) { sz2 = __right_->print(f+std::min(sz1+1, r), l); if (r >= sz1 + sz2 + 2) { if (f[sz1+sz2] == '>') { f[sz1+sz2+1] = ' '; ++n; } } else if (__right_->ends_with_template()) ++n; } if (r >= sz1 + sz2 + n) { f[sz1] = '<'; f[sz1+sz2+n-1] = '>'; } return n + sz1 + sz2; } virtual bool ends_with_template() const { return true; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_ctor_dtor_conv() const { return __left_->is_ctor_dtor_conv(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __function_args : public __node { public: __function_args(__node* list) {__right_ = list;} virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = 2 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { *buf++ = '('; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 2; if (r < n) return n + __right_->print(l, l); ptrdiff_t sz1 = __right_->print(f+1, l); if (r >= n + sz1) { *f = '('; f += 1 + sz1; *f = ')'; } return n + sz1; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __cv_qualifiers : public __node { public: __cv_qualifiers(size_t cv, __node* type) { __left_ = type; __size_ = __left_->is_function() ? cv << 5 : cv; } virtual size_t first_size() const { size_t s = __left_->first_size(); if (__size_ & 4) s += sizeof(" restrict")-1; if (__size_ & 2) s += sizeof(" volatile")-1; if (__size_ & 1) s += sizeof(" const")-1; if (__size_ & 8) s += sizeof(" &")-1; if (__size_ & 16) s += sizeof(" &&")-1; return s; } virtual char* first_demangled_name(char* buf) const { buf = __left_->first_demangled_name(buf); if (__size_ & 1) { const size_t n = sizeof(" const")-1; strncpy(buf, " const", n); buf += n; } if (__size_ & 2) { const size_t n = sizeof(" volatile")-1; strncpy(buf, " volatile", n); buf += n; } if (__size_ & 4) { const size_t n = sizeof(" restrict")-1; strncpy(buf, " restrict", n); buf += n; } if (__size_ & 8) { *buf++ = ' '; *buf++ = '&'; } if (__size_ & 16) { *buf++ = ' '; *buf++ = '&'; *buf++ = '&'; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print_first(f, l); ptrdiff_t n = 0; if (__size_ & 0x1F) { if (__size_ & 1) { const ptrdiff_t d = sizeof(" const")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'c'; *t++ = 'o'; *t++ = 'n'; *t++ = 's'; *t = 't'; } n += d; } if (__size_ & 2) { const ptrdiff_t d = sizeof(" volatile")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'v'; *t++ = 'o'; *t++ = 'l'; *t++ = 'a'; *t++ = 't'; *t++ = 'i'; *t++ = 'l'; *t = 'e'; } n += d; } if (__size_ & 4) { const ptrdiff_t d = sizeof(" restrict")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'r'; *t++ = 'e'; *t++ = 's'; *t++ = 't'; *t++ = 'r'; *t++ = 'i'; *t++ = 'c'; *t = 't'; } n += d; } if (__size_ & 8) { const ptrdiff_t d = sizeof(" &")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t = '&'; } n += d; } if (__size_ & 16) { const ptrdiff_t d = sizeof(" &&")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = '&'; *t = '&'; } n += d; } } return n + sz; } virtual size_t second_size() const { size_t s = __left_->second_size(); if (__size_ & 128) s += sizeof(" restrict")-1; if (__size_ & 64) s += sizeof(" volatile")-1; if (__size_ & 32) s += sizeof(" const")-1; if (__size_ & 256) s += sizeof(" &")-1; if (__size_ & 512) s += sizeof(" &&")-1; return s; } virtual char* second_demangled_name(char* buf) const { buf = __left_->second_demangled_name(buf); if (__size_ & 32) { const size_t n = sizeof(" const")-1; strncpy(buf, " const", n); buf += n; } if (__size_ & 64) { const size_t n = sizeof(" volatile")-1; strncpy(buf, " volatile", n); buf += n; } if (__size_ & 128) { const size_t n = sizeof(" restrict")-1; strncpy(buf, " restrict", n); buf += n; } if (__size_ & 256) { *buf++ = ' '; *buf++ = '&'; } if (__size_ & 512) { *buf++ = ' '; *buf++ = '&'; *buf++ = '&'; } return buf; } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print_second(f, l); ptrdiff_t n = 0; if (__size_ & 0x3E0) { if (__size_ & 32) { const ptrdiff_t d = sizeof(" const")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'c'; *t++ = 'o'; *t++ = 'n'; *t++ = 's'; *t = 't'; } n += d; } if (__size_ & 64) { const ptrdiff_t d = sizeof(" volatile")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'v'; *t++ = 'o'; *t++ = 'l'; *t++ = 'a'; *t++ = 't'; *t++ = 'i'; *t++ = 'l'; *t = 'e'; } n += d; } if (__size_ & 128) { const ptrdiff_t d = sizeof(" restrict")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = 'r'; *t++ = 'e'; *t++ = 's'; *t++ = 't'; *t++ = 'r'; *t++ = 'i'; *t++ = 'c'; *t = 't'; } n += d; } if (__size_ & 256) { const ptrdiff_t d = sizeof(" &")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t = '&'; } n += d; } if (__size_ & 512) { const ptrdiff_t d = sizeof(" &&")-1; if (r >= sz + n + d) { char* t = f + sz + n; *t++ = ' '; *t++ = '&'; *t = '&'; } n += d; } } return n + sz; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_reference_or_pointer_to_function_or_array(); } virtual bool is_function() const { return __left_->is_function(); } virtual bool is_cv_qualifer() const { return true; } virtual __node* extract_cv(__node*& rt) const { if (rt == this) { rt = __left_; return const_cast<__node*>(static_cast(this)); } return 0; } virtual bool ends_with_template() const { return __left_->ends_with_template(); } virtual bool is_ctor_dtor_conv() const { return __left_->is_ctor_dtor_conv(); } virtual bool is_array() const { return __left_->is_array(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } virtual size_t list_len() const { return __left_->list_len(); } }; class __extended_qualifier : public __node { public: __extended_qualifier(__node* name, __node* type) { __left_ = type; __right_ = name; __size_ = __left_->is_function() ? 1 : 0; } virtual size_t first_size() const { size_t s = __left_->first_size(); if (__size_ == 0) s += __right_->size() + 1; return s; } virtual char* first_demangled_name(char* buf) const { buf = __left_->first_demangled_name(buf); if (__size_ == 0) { *buf++ = ' '; buf = __right_->get_demangled_name(buf); } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz1 = __left_->print_first(f, l); ptrdiff_t sz2 = 0; ptrdiff_t n = 0; if (__size_ == 0) { if (r < sz1 + 1) return sz1 + 1 + __right_->print(l, l); sz2 = __right_->print(f+1+sz1, l); n = 1; f[sz1] = ' '; } return n + sz1 + sz2; } virtual size_t second_size() const { size_t s = __left_->second_size(); if (__size_ == 1) s += __right_->size() + 1; return s; } virtual char* second_demangled_name(char* buf) const { buf = __left_->second_demangled_name(buf); if (__size_ == 1) { *buf++ = ' '; buf = __right_->get_demangled_name(buf); } return buf; } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz1 = __left_->print_second(f, l); ptrdiff_t sz2 = 0; ptrdiff_t n = 0; if (__size_ == 1) { if (r < sz1 + 1) return sz1 + 1 + __right_->print(l, l); sz2 = __right_->print(f+1+sz1, l); n = 1; f[sz1] = ' '; } return n + sz1 + sz2; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_reference_or_pointer_to_function_or_array(); } virtual bool is_function() const { return __left_->is_function(); } virtual bool is_cv_qualifer() const { return true; } virtual __node* extract_cv(__node*& rt) const { if (rt == this) { rt = __left_; return const_cast<__node*>(static_cast(this)); } return 0; } virtual bool ends_with_template() const { return __left_->ends_with_template(); } virtual bool is_ctor_dtor_conv() const { return __left_->is_ctor_dtor_conv(); } virtual bool is_array() const { return __left_->is_array(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } virtual size_t list_len() const { return __left_->list_len(); } }; class __function : public __node { public: __function(__node* name, __node* signature, size_t ret_goes_first = true) { __size_ = ret_goes_first; __left_ = name; __right_ = signature; } virtual size_t first_size() const { size_t off = 0; if (__size_) { off = __right_->first_size(); if (off > 0 && (__left_ == NULL || !__right_->__left_->is_reference_or_pointer_to_function_or_array())) ++off; } else off = 5; if (__left_) off += __left_->first_size(); else ++off; return off; } virtual size_t second_size() const { size_t off = 0; if (__left_ == NULL) off = 1; off += __right_->second_size(); if (!__size_) { off += 2; off += __right_->first_size(); } return off; } virtual char* first_demangled_name(char* buf) const { if (__size_) { const char* t = buf; buf = __right_->first_demangled_name(buf); if (buf != t && (__left_ == NULL || !__right_->__left_->is_reference_or_pointer_to_function_or_array())) *buf++ = ' '; } else { strncpy(buf, "auto ", 5); buf += 5; } if (__left_) buf = __left_->first_demangled_name(buf); else *buf++ = '('; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; ptrdiff_t sz1 = 0; ptrdiff_t sz2 = 0; if (__size_) { sz1 = __right_->print_first(f, l); if (sz1 != 0 && (__left_ == NULL || !__right_->__left_->is_reference_or_pointer_to_function_or_array())) { ++n; if (r >= sz1 + 1) f[sz1] = ' '; } } else { n = 5; if (r >= 5) { char* t = f; *t++ = 'a'; *t++ = 'u'; *t++ = 't'; *t++ = 'o'; *t++ = ' '; } } if (__left_) sz2 = __left_->print_first(f + std::min(n + sz1, r), l); else { ++n; if (r >= n + sz1) f[n+sz1-1] = '('; } return n + sz1 + sz2; } virtual char* second_demangled_name(char* buf) const { if (__left_ == NULL) *buf++ = ')'; buf = __right_->second_demangled_name(buf); if (!__size_) { *buf++ = '-'; *buf++ = '>'; buf = __right_->first_demangled_name(buf); } return buf; } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; ptrdiff_t sz1 = 0; ptrdiff_t sz2 = 0; if (__left_ == NULL) { n = 1; if (r >= 1) *f = ')'; } sz1 = __right_->print_second(f+std::min(r, n), l); if (!__size_) { if (r > n+sz1+1) { f[n+sz1] = '-'; f[n+sz1+1] = '>'; } n += 2; sz2 = __right_->print_first(f+std::min(r, n+sz1), l); } return n + sz1 + sz2; } virtual bool is_function() const { return true; } virtual bool is_ctor_dtor_conv() const { return __left_->is_ctor_dtor_conv(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __function_signature : public __node { public: __function_signature(__node* ret, __node* args) { __left_ = ret; __right_ = args; } virtual size_t first_size() const { return __left_ ? __left_->first_size() : 0; } virtual size_t second_size() const { return 2 + (__right_ ? __right_->size() : 0) + (__left_ ? __left_->second_size() : 0); } virtual char* first_demangled_name(char* buf) const { if (__left_) buf = __left_->first_demangled_name(buf); return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { return __left_ ? __left_->print_first(f, l) : 0; } virtual char* second_demangled_name(char* buf) const { *buf++ = '('; if (__right_) buf = __right_->get_demangled_name(buf); *buf++ = ')'; if (__left_) buf = __left_->second_demangled_name(buf); return buf; } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz1 = __right_ ? __right_->print(f+std::min(1, r), l) : 0; const ptrdiff_t sz2 = __left_ ? __left_->print_second(f+std::min(2+sz1, r), l) : 0; if (r >= 2 + sz1 + sz2) { *f = '('; f += 1 + sz1; *f = ')'; } return 2 + sz1 + sz2; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = r && __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __pointer_to : public __node { public: explicit __pointer_to(__node* type) { __left_ = type; } virtual size_t first_size() const { return __left_->first_size() + (__left_->is_array() ? 3 : 1); } virtual size_t second_size() const { return __left_->second_size() + (__left_->is_array() ? 1 : 0); } virtual char* first_demangled_name(char* buf) const { buf = __left_->first_demangled_name(buf); if (__left_->is_array()) { *buf++ = ' '; *buf++ = '('; *buf++ = '*'; } else *buf++ = '*'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print_first(f, l); ptrdiff_t n; if (__left_->is_array()) { n = 3; if (r >= sz + n) { f += sz; *f++ = ' '; *f++ = '('; *f = '*'; } } else { n = 1; if (r >= sz + n) f[sz] = '*'; } return sz + n; } virtual char* second_demangled_name(char* buf) const { if (__left_->is_array()) *buf++ = ')'; return __left_->second_demangled_name(buf); } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; if (__left_->is_array()) { n = 1; if (r > n) *f = ')'; } return __left_->print_second(f + std::min(n, r), l) + n; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_function() || __left_->is_reference_or_pointer_to_function_or_array(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } virtual size_t list_len() const { return __left_->list_len(); } }; class __lvalue_reference_to : public __node { public: explicit __lvalue_reference_to(__node* type) { __left_ = type; } virtual size_t first_size() const { return __left_->first_size() + (__left_->is_array() ? 3 : 1); } virtual size_t second_size() const { return __left_->second_size() + (__left_->is_array() ? 1 : 0); } virtual char* first_demangled_name(char* buf) const { buf = __left_->first_demangled_name(buf); if (__left_->is_array()) { *buf++ = ' '; *buf++ = '('; *buf++ = '&'; } else *buf++ = '&'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print_first(f, l); ptrdiff_t n; if (__left_->is_array()) { n = 3; if (r >= sz + n) { f += sz; *f++ = ' '; *f++ = '('; *f = '&'; } } else { n = 1; if (r >= sz + n) f[sz] = '&'; } return sz + n; } virtual char* second_demangled_name(char* buf) const { if (__left_->is_array()) *buf++ = ')'; return __left_->second_demangled_name(buf); } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; if (__left_->is_array()) { n = 1; if (r > n) *f = ')'; } return __left_->print_second(f + std::min(n, r), l) + n; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_function(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } virtual size_t list_len() const { return __left_->list_len(); } }; class __rvalue_reference_to : public __node { public: explicit __rvalue_reference_to(__node* type) { __left_ = type; } virtual size_t first_size() const { return __left_->first_size() + (__left_->is_array() ? 4 : 2); } virtual size_t second_size() const { return __left_->second_size() + (__left_->is_array() ? 1 : 0); } virtual char* first_demangled_name(char* buf) const { buf = __left_->first_demangled_name(buf); if (__left_->is_array()) { strncpy(buf, " (&&", 4); buf += 4; } else { *buf++ = '&'; *buf++ = '&'; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print_first(f, l); ptrdiff_t n; if (__left_->is_array()) { n = 4; if (r >= sz + n) { f += sz; *f++ = ' '; *f++ = '('; *f++ = '&'; *f = '&'; } } else { n = 2; if (r >= sz + n) { f += sz; *f++ = '&'; *f = '&'; } } return sz + n; } virtual char* second_demangled_name(char* buf) const { if (__left_->is_array()) *buf++ = ')'; return __left_->second_demangled_name(buf); } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; if (__left_->is_array()) { n = 1; if (r > n) *f = ')'; } return __left_->print_second(f + std::min(n, r), l) + n; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __left_->is_function(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } virtual size_t list_len() const { return __left_->list_len(); } }; class __d_complex : public __node { static const size_t n = sizeof(" complex") - 1; public: explicit __d_complex(__node* type) { __left_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __left_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); strncpy(buf, " complex", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print(f, l); const ptrdiff_t n = sizeof(" complex") - 1; if (r >= sz + n) { f += sz; *f++ = ' '; *f++ = 'c'; *f++ = 'o'; *f++ = 'm'; *f++ = 'p'; *f++ = 'l'; *f++ = 'e'; *f = 'x'; } return sz + n; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } }; class __imaginary : public __node { static const size_t n = sizeof(" imaginary") - 1; public: explicit __imaginary(__node* type) { __left_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = n + __left_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); strncpy(buf, " imaginary", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t sz = __left_->print(f, l); const ptrdiff_t n = sizeof(" imaginary") - 1; if (r >= sz + n) { f += sz; *f++ = ' '; *f++ = 'i'; *f++ = 'm'; *f++ = 'a'; *f++ = 'g'; *f++ = 'i'; *f++ = 'n'; *f++ = 'a'; *f++ = 'r'; *f = 'y'; } return sz + n; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } }; class __pack_expansion : public __node { public: explicit __pack_expansion(__node* type) { __left_ = type; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t len = __left_->list_len(); size_t off = 0; if (len != 0) { if (__left_->is_sub() || len == 1) off = __left_->size(); else { __node* top = __left_; __node* bottom = top; while (!bottom->__left_->is_sub()) bottom = bottom->__left_; __node* sub = bottom->__left_; __node* i = sub->__left_; bool first = true; top->reset_cached_size(); while (i) { if (!first) off += 2; bottom->__left_ = i->__left_; off += top->size(); top->reset_cached_size(); i = i->__right_; first = false; } bottom->__left_ = sub; } } const_cast(__cached_size_) = off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { size_t len = __left_->list_len(); if (len != 0) { if (__left_->is_sub() || len == 1) buf = __left_->get_demangled_name(buf); else { __node* top = __left_; __node* bottom = top; while (!bottom->__left_->is_sub()) bottom = bottom->__left_; __node* sub = bottom->__left_; __node* i = sub->__left_; bool first = true; top->reset_cached_size(); while (i) { if (!first) { *buf++ = ','; *buf++ = ' '; } bottom->__left_ = i->__left_; buf = top->get_demangled_name(buf); top->reset_cached_size(); i = i->__right_; first = false; } bottom->__left_ = sub; } } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t len = __left_->list_len(); ptrdiff_t sz = 0; if (len != 0) { if (__left_->is_sub() || len == 1) sz = __left_->print(f, l); else { __node* top = __left_; __node* bottom = top; while (!bottom->__left_->is_sub()) bottom = bottom->__left_; __node* sub = bottom->__left_; __node* i = sub->__left_; bool first = true; while (i) { if (!first) { if (r >= sz+2) { f[sz] = ','; f[sz+1] = ' '; } sz += 2; } bottom->__left_ = i->__left_; sz += top->print(f+std::min(sz, r), l); i = i->__right_; first = false; } bottom->__left_ = sub; } } return sz; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } }; class __void : public __node { static const size_t n = sizeof("void") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "void", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'v'; *f++ = 'o'; *f++ = 'i'; *f = 'd'; } return n; } }; class __wchar_t : public __node { static const size_t n = sizeof("wchar_t") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "wchar_t", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'w'; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = '_'; *f = 't'; } return n; } }; class __wchar_t_literal : public __node { public: explicit __wchar_t_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+9; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(wchar_t)", 9); buf += 9; strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(wchar_t)") - 1; if (r >= n + __size_) { *f++ = '('; *f++ = 'w'; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = '_'; *f++ = 't'; *f++ = ')'; strncpy(f, __name_, __size_); } return n + __size_; } }; class __bool : public __node { static const size_t n = sizeof("bool") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "bool", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'b'; *f++ = 'o'; *f++ = 'o'; *f = 'l'; } return n; } }; class __bool_literal : public __node { public: explicit __bool_literal(const char* __name, unsigned __size) { __name_ = __name; __size_ = __size; } virtual size_t first_size() const { return __size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= __size_) strncpy(f, __name_, __size_); return __size_; } }; class __char : public __node { static const size_t n = sizeof("char") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "char", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f = 'r'; } return n; } }; class __char_literal : public __node { public: explicit __char_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+6; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(char)", 6); buf += 6; if (*__name_ == 'n') { *buf++ = '-'; // strncpy(buf+6, "-", 1); strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(char)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = ')'; if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); } else strncpy(f, __name_, __size_); } return __size_ + n; } }; class __signed_char : public __node { static const size_t n = sizeof("signed char") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "signed char", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f = 'r'; } return n; } }; class __signed_char_literal : public __node { public: explicit __signed_char_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+13; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(signed char)", 13); buf += 13; if (*__name_ == 'n') { *buf++ = '-'; strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(signed char)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = ')'; if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); } else strncpy(f, __name_, __size_); } return __size_ + n; } }; class __unsigned_char : public __node { static const size_t n = sizeof("unsigned char") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned char", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f = 'r'; } return n; } }; class __unsigned_char_literal : public __node { public: explicit __unsigned_char_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+15; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(unsigned char)", 15); buf += 15; strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(unsigned char)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = ')'; strncpy(f, __name_, __size_); } return __size_ + n; } }; class __short : public __node { static const size_t n = sizeof("short") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "short", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 'h'; *f++ = 'o'; *f++ = 'r'; *f = 't'; } return n; } }; class __short_literal : public __node { public: explicit __short_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+7; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(short)", 7); buf += 7; if (*__name_ == 'n') { *buf++ = '-'; strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(short)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 's'; *f++ = 'h'; *f++ = 'o'; *f++ = 'r'; *f++ = 't'; *f++ = ')'; if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); } else strncpy(f, __name_, __size_); } return __size_ + n; } }; class __unsigned_short : public __node { static const size_t n = sizeof("unsigned short") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned short", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 's'; *f++ = 'h'; *f++ = 'o'; *f++ = 'r'; *f = 't'; } return n; } }; class __unsigned_short_literal : public __node { public: explicit __unsigned_short_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+16; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(unsigned short)", 16); buf += 16; strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(unsigned short)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 's'; *f++ = 'h'; *f++ = 'o'; *f++ = 'r'; *f++ = 't'; *f++ = ')'; strncpy(f, __name_, __size_); } return __size_ + n; } }; class __int : public __node { static const size_t n = sizeof("int") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { *buf++ = 'i'; *buf++ = 'n'; *buf++ = 't'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'i'; *f++ = 'n'; *f = 't'; } return n; } }; class __int_literal : public __node { public: explicit __int_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_; } virtual char* first_demangled_name(char* buf) const { if (*__name_ == 'n') { *buf++ = '-'; strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= __size_) { if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); } else strncpy(f, __name_, __size_); } return __size_; } }; class __unsigned_int : public __node { static const size_t n = sizeof("unsigned int") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned int", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'i'; *f++ = 'n'; *f = 't'; } return n; } }; class __unsigned_int_literal : public __node { public: explicit __unsigned_int_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+1; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, __name_, __size_); buf += __size_; *buf++ = 'u'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("u") - 1; if (r >= __size_ + n) { strncpy(f, __name_, __size_); f[__size_] = 'u'; } return __size_ + n; } }; class __long : public __node { static const size_t n = sizeof("long") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "long", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f = 'g'; } return n; } }; class __long_literal : public __node { public: explicit __long_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+1; } virtual char* first_demangled_name(char* buf) const { if (*__name_ == 'n') { *buf++ = '-'; // strncpy(buf, "-", 1); strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } *buf++ = 'l'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("l") - 1; if (r >= __size_ + n) { if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); f += __size_-1; } else { strncpy(f, __name_, __size_); f += __size_; } *f = 'l'; } return __size_ + n; } }; class __unsigned_long : public __node { static const size_t n = sizeof("unsigned long") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned long", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f = 'g'; } return n; } }; class __unsigned_long_literal : public __node { public: explicit __unsigned_long_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+2; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, __name_, __size_); buf += __size_; *buf++ = 'u'; *buf++ = 'l'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("ul") - 1; if (r >= __size_ + n) { strncpy(f, __name_, __size_); f += __size_; *f++ = 'u'; *f = 'l'; } return __size_ + n; } }; class __long_long : public __node { static const size_t n = sizeof("long long") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "long long", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f++ = 'g'; *f++ = ' '; *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f = 'g'; } return n; } }; class __long_long_literal : public __node { public: explicit __long_long_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+2; } virtual char* first_demangled_name(char* buf) const { if (*__name_ == 'n') { *buf++ = '-'; strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } *buf++ = 'l'; *buf++ = 'l'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("ll") - 1; if (r >= __size_ + n) { if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); f += __size_-1; } else { strncpy(f, __name_, __size_); f += __size_; } *f++ = 'l'; *f = 'l'; } return __size_ + n; } }; class __unsigned_long_long : public __node { static const size_t n = sizeof("unsigned long long") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned long long", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f++ = 'g'; *f++ = ' '; *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f = 'g'; } return n; } }; class __unsigned_long_long_literal : public __node { public: explicit __unsigned_long_long_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+3; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, __name_, __size_); buf += __size_; *buf++ = 'u'; *buf++ = 'l'; *buf++ = 'l'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("ull") - 1; if (r >= __size_ + n) { strncpy(f, __name_, __size_); f += __size_; *f++ = 'u'; *f++ = 'l'; *f = 'l'; } return __size_ + n; } }; class __int128 : public __node { static const size_t n = sizeof("__int128") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "__int128", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = '_'; *f++ = '_'; *f++ = 'i'; *f++ = 'n'; *f++ = 't'; *f++ = '1'; *f++ = '2'; *f = '8'; } return n; } }; class __int128_literal : public __node { public: explicit __int128_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+10; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(__int128)", 10); buf += 10; if (*__name_ == 'n') { *buf++ = '-'; strncpy(buf, __name_+1, __size_-1); buf += __size_ - 1; } else { strncpy(buf, __name_, __size_); buf += __size_; } return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(__int128)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = '_'; *f++ = '_'; *f++ = 'i'; *f++ = 'n'; *f++ = 't'; *f++ = '1'; *f++ = '2'; *f++ = '8'; *f = ')'; if (*__name_ == 'n') { *f++ = '-'; strncpy(f, __name_+1, __size_-1); } else strncpy(f, __name_, __size_); } return __size_ + n; } }; class __unsigned_int128 : public __node { static const size_t n = sizeof("unsigned __int128") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "unsigned __int128", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = '_'; *f++ = '_'; *f++ = 'i'; *f++ = 'n'; *f++ = 't'; *f++ = '1'; *f++ = '2'; *f = '8'; } return n; } }; class __unsigned_int128_literal : public __node { public: explicit __unsigned_int128_literal(const char* __first, const char* __last) { __name_ = __first; __size_ = __last - __first; } virtual size_t first_size() const { return __size_+19; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "(unsigned __int128)", 19); buf += 19; strncpy(buf, __name_, __size_); return buf + __size_; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("(unsigned __int128)") - 1; if (r >= __size_ + n) { *f++ = '('; *f++ = 'u'; *f++ = 'n'; *f++ = 's'; *f++ = 'i'; *f++ = 'g'; *f++ = 'n'; *f++ = 'e'; *f++ = 'd'; *f++ = ' '; *f++ = '_'; *f++ = '_'; *f++ = 'i'; *f++ = 'n'; *f++ = 't'; *f++ = '1'; *f++ = '2'; *f++ = '8'; *f = ')'; strncpy(f, __name_, __size_); } return __size_ + n; } }; class __float_literal : public __node { public: explicit __float_literal(float value) { __value_ = value; } virtual size_t first_size() const { if (__cached_size_ == -1) { char num[20] = {0}; float v = static_cast(__value_); const_cast(__cached_size_) = sprintf(num, "%a", v)+1; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { char num[20] = {0}; float v = static_cast(__value_); int n = sprintf(num, "%a", v); strncpy(buf, num, n); buf += n; *buf++ = 'f'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; char num[20] = {0}; float v = static_cast(__value_); ptrdiff_t n = sprintf(num, "%a", v); if (r >= n+1) { strncpy(f, num, n); f[n] = 'f'; } ++n; return n; } }; class __float : public __node { static const size_t n = sizeof("float") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "float", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'f'; *f++ = 'l'; *f++ = 'o'; *f++ = 'a'; *f = 't'; } return n; } }; class __double_literal : public __node { public: explicit __double_literal(double value) { __value_ = value; } virtual size_t first_size() const { if (__cached_size_ == -1) { char num[30] = {0}; double v = static_cast(__value_); const_cast(__cached_size_) = sprintf(num, "%a", v); } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { char num[30] = {0}; double v = static_cast(__value_); int n = sprintf(num, "%a", v); strncpy(buf, num, n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; char num[30] = {0}; double v = static_cast(__value_); const ptrdiff_t n = sprintf(num, "%a", v); if (r >= n) strncpy(f, num, n); return n; } }; class __double : public __node { static const size_t n = sizeof("double") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "double", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'd'; *f++ = 'o'; *f++ = 'u'; *f++ = 'b'; *f++ = 'l'; *f = 'e'; } return n; } }; class __long_double : public __node { static const size_t n = sizeof("long double") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "long double", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'l'; *f++ = 'o'; *f++ = 'n'; *f++ = 'g'; *f++ = ' '; *f++ = 'd'; *f++ = 'o'; *f++ = 'u'; *f++ = 'b'; *f++ = 'l'; *f = 'e'; } return n; } }; class __float128 : public __node { static const size_t n = sizeof("__float128") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "__float128", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = '_'; *f++ = '_'; *f++ = 'f'; *f++ = 'l'; *f++ = 'o'; *f++ = 'a'; *f++ = 't'; *f++ = '1'; *f++ = '2'; *f = '8'; } return n; } }; class __ellipsis : public __node { static const size_t n = sizeof("...") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { *buf++ = '.'; *buf++ = '.'; *buf++ = '.'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = '.'; *f++ = '.'; *f = '.'; } return n; } }; class __decimal64 : public __node { static const size_t n = sizeof("decimal64") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "decimal64", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'd'; *f++ = 'e'; *f++ = 'c'; *f++ = 'i'; *f++ = 'm'; *f++ = 'a'; *f++ = 'l'; *f++ = '6'; *f = '4'; } return n; } }; class __decimal128 : public __node { static const size_t n = sizeof("decimal128") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "decimal128", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'd'; *f++ = 'e'; *f++ = 'c'; *f++ = 'i'; *f++ = 'm'; *f++ = 'a'; *f++ = 'l'; *f++ = '1'; *f++ = '2'; *f = '8'; } return n; } }; class __decimal32 : public __node { static const size_t n = sizeof("decimal32") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "decimal32", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'd'; *f++ = 'e'; *f++ = 'c'; *f++ = 'i'; *f++ = 'm'; *f++ = 'a'; *f++ = 'l'; *f++ = '3'; *f = '2'; } return n; } }; class __decimal16 : public __node { static const size_t n = sizeof("decimal16") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "decimal16", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'd'; *f++ = 'e'; *f++ = 'c'; *f++ = 'i'; *f++ = 'm'; *f++ = 'a'; *f++ = 'l'; *f++ = '1'; *f = '6'; } return n; } }; class __d_char32_t : public __node { static const size_t n = sizeof("char32_t") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "char32_t", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = '3'; *f++ = '2'; *f++ = '_'; *f = 't'; } return n; } }; class __d_char16_t : public __node { static const size_t n = sizeof("char16_t") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "char16_t", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'c'; *f++ = 'h'; *f++ = 'a'; *f++ = 'r'; *f++ = '1'; *f++ = '6'; *f++ = '_'; *f = 't'; } return n; } }; class __auto : public __node { static const size_t n = sizeof("auto") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "auto", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 'a'; *f++ = 'u'; *f++ = 't'; *f = 'o'; } return n; } }; class __nullptr_t : public __node { static const size_t n = sizeof("std::nullptr_t") - 1; public: virtual size_t first_size() const {return n;} virtual char* first_demangled_name(char* buf) const { strncpy(buf, "std::nullptr_t", n); return buf + n; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'd'; *f++ = ':'; *f++ = ':'; *f++ = 'n'; *f++ = 'u'; *f++ = 'l'; *f++ = 'l'; *f++ = 'p'; *f++ = 't'; *f++ = 'r'; *f++ = '_'; *f = 't'; } return n; } }; class __array : public __node { public: explicit __array(__node* type) { __left_ = type; } __array(__node* type, size_t dim) { __left_ = type; __size_ = dim; } __array(__node* type, __node* dim) { __left_ = type; __right_ = dim; } virtual size_t size() const { if (__cached_size_ == -1) { size_t r = __left_->size() + 3; if (__right_ != 0) r += __right_->size(); else if (__size_ != 0) r += snprintf(0, 0, "%ld", __size_); const_cast(__cached_size_) = r; } return __cached_size_; } virtual char* get_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = ' '; *buf++ = '['; if (__right_ != 0) buf = __right_->get_demangled_name(buf); else if (__size_ != 0) { size_t rs = sprintf(buf, "%ld", __size_); buf += rs; } *buf++ = ']'; return buf; } virtual ptrdiff_t print(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 3; const ptrdiff_t sz1 = __left_->print(f, l); char buf[20]; ptrdiff_t sz2 = 0; if (__right_ != 0) sz2 = __right_->print(f+std::min(sz1+(n-1), r), l); else if (__size_ != 0) { sz2 = sprintf(buf, "%ld", __size_); if (r >= sz1 + sz2 + n) strncpy(f+sz1+2, buf, sz2); } if (r >= sz1 + sz2 + n) { f += sz1; *f++ = ' '; *f = '['; f += 1 + sz2; *f = ']'; } return sz1 + sz2 + n; } virtual size_t first_size() const { return __left_->first_size(); } virtual char* first_demangled_name(char* buf) const { return __left_->first_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { return __left_->print_first(f, l); } virtual size_t second_size() const { size_t r = 2 + __left_->second_size(); if (!__left_->is_array()) ++r; if (__right_ != 0) r += __right_->size(); else if (__size_ != 0) r += snprintf(0, 0, "%ld", __size_); return r; } virtual char* second_demangled_name(char* buf) const { *buf++ = ' '; *buf++ = '['; if (__right_ != 0) buf = __right_->get_demangled_name(buf); else if (__size_ != 0) { size_t off = sprintf(buf, "%ld", __size_); buf += off; } char* t = buf; buf = __left_->second_demangled_name(buf); *t = ']'; if (buf == t) ++buf; return buf; } virtual ptrdiff_t print_second(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 2; char buf[20]; ptrdiff_t sz2 = 0; if (__right_ != 0) sz2 = __right_->print(f+std::min(n, r), l); else if (__size_ != 0) { sz2 = sprintf(buf, "%ld", __size_); if (r >= sz2 + 3) strncpy(f+2, buf, sz2); } const ptrdiff_t sz1 = __left_->print_second(f+std::min(2+sz2, r), l); if (sz1 == 0) ++n; if (r >= sz1 + sz2 + n) { *f++ = ' '; *f = '['; f += 1 + sz2; *f = ']'; } return sz1 + sz2 + n; } virtual bool is_array() const { return true; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = __left_->fix_forward_references(t_begin, t_end); if (__right_) r = r && __right_->fix_forward_references(t_begin, t_end); return r; } }; class __pointer_to_member_type : public __node { public: __pointer_to_member_type(__node* class_type, __node* member_type) { __left_ = class_type; __right_ = member_type; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + 3 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __right_->first_demangled_name(buf); buf = __left_->get_demangled_name(buf); *buf++ = ':'; *buf++ = ':'; *buf++ = '*'; return __right_->second_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 3; const ptrdiff_t sz1 = __right_->print_first(f, l); const ptrdiff_t sz2 = __left_->print(f+std::min(sz1, r), l); const ptrdiff_t sz3 = __right_->print_second(f+std::min(sz1+sz2+n, r), l); if (r >= sz1 + sz2 + sz3 + n) { f += sz1 + sz2; *f++ = ':'; *f++ = ':'; *f = '*'; } return sz1 + sz2 + sz3 + n; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool is_reference_or_pointer_to_function_or_array() const { return __right_->is_function(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } }; class __decltype_node : public __node { public: explicit __decltype_node(__node* expr) { __right_ = expr; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = 10 + __right_->size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "decltype(", 9); buf += 9; buf = __right_->get_demangled_name(buf); *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("decltype()") - 1; const ptrdiff_t sz1 = __right_->print(f+std::min(n-1, r), l); if (r >= sz1 + n) { *f++ = 'd'; *f++ = 'e'; *f++ = 'c'; *f++ = 'l'; *f++ = 't'; *f++ = 'y'; *f++ = 'p'; *f++ = 'e'; *f = '('; f += 1 + sz1; *f = ')'; } return sz1 + n; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __nested_delimeter : public __node { public: explicit __nested_delimeter(__node* prev, __node* arg) { __left_ = prev; __right_ = arg; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __left_->size() + __right_->size() + 2; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = ':'; *buf++ = ':'; return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("::") - 1; const ptrdiff_t sz1 = __left_->print(f, l); if (r >= sz1 + n) { f += sz1; *f++ = ':'; *f++ = ':'; } const ptrdiff_t sz2 = __right_->print(f, l); return sz1 + n + sz2; } virtual bool ends_with_template() const { return __right_->ends_with_template(); } virtual __node* base_name() const { return __right_->base_name(); } virtual bool is_ctor_dtor_conv() const { return __right_->is_ctor_dtor_conv(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end) && __right_->fix_forward_references(t_begin, t_end); } virtual __node* extract_cv(__node*& rt) const { return __right_->extract_cv(const_cast<__node*&>(__right_)); } }; class __unresolved_name : public __node { public: __unresolved_name(__node* prev, __node* arg) { __left_ = prev; __right_ = arg; } __unresolved_name(bool global, __node* prev, __node* arg) { __size_ = global; __left_ = prev; __right_ = arg; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = (__left_ ? __left_->size() + 2 : 0) + __right_->size() + __size_ * 2; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { if (__size_) { *buf++ = ':'; *buf++ = ':'; } if (__left_) { buf = __left_->get_demangled_name(buf); *buf++ = ':'; *buf++ = ':'; } return __right_->get_demangled_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; ptrdiff_t n = 0; if (__size_) { n = 2; if (r >= n) { f[0] = ':'; f[1] = ':'; } } ptrdiff_t sz1 = 0; if (__left_) { sz1 = __left_->print(f+std::min(n, r), l); n += 2; if (r >= sz1 + n) { f[sz1 + n - 2] = ':'; f[sz1 + n - 1] = ':'; } } const ptrdiff_t sz2 = __right_->print(f+std::min(sz1+n, r), l); return sz1 + n + sz2; } virtual bool ends_with_template() const { return __right_->ends_with_template(); } virtual __node* base_name() const { return __right_->base_name(); } virtual bool is_ctor_dtor_conv() const { return __right_->is_ctor_dtor_conv(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { bool r = true; if (__left_) r = __left_->fix_forward_references(t_begin, t_end); return r && __right_->fix_forward_references(t_begin, t_end); } virtual __node* extract_cv(__node*& rt) const { return __right_->extract_cv(const_cast<__node*&>(__right_)); } }; class __string_literal : public __node { public: virtual size_t first_size() const { return 14; } virtual char* first_demangled_name(char* buf) const { strncpy(buf, "string literal", 14); return buf + 14; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = sizeof("string literal") - 1; if (r >= n) { *f++ = 's'; *f++ = 't'; *f++ = 'r'; *f++ = 'i'; *f++ = 'n'; *f++ = 'g'; *f++ = ' '; *f++ = 'l'; *f++ = 'i'; *f++ = 't'; *f++ = 'e'; *f++ = 'r'; *f++ = 'a'; *f = 'l'; } return n; } }; class __constructor : public __node { public: explicit __constructor(__node* name) { __right_ = name; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __right_->base_size(); return __cached_size_; } virtual char* first_demangled_name(char* buf) const { return __right_->get_base_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { return __right_->print_base_name(f, l); } virtual __node* base_name() const { return __right_->base_name(); } virtual bool ends_with_template() const { return __right_->ends_with_template(); } virtual bool is_ctor_dtor_conv() const { return true; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __destructor : public __node { public: explicit __destructor(__node* name) { __right_ = name; } virtual size_t first_size() const { if (__cached_size_ == -1) const_cast(__cached_size_) = __right_->base_size() + 1; return __cached_size_; } virtual char* first_demangled_name(char* buf) const { *buf++ = '~'; return __right_->get_base_name(buf); } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 1; const ptrdiff_t sz = __right_->print_base_name(f+std::min(n, r), l); if (r >= n + sz) *f = '~'; return n + sz; } virtual __node* base_name() const { return __right_->base_name(); } virtual bool is_ctor_dtor_conv() const { return true; } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __right_->fix_forward_references(t_begin, t_end); } }; class __dot_suffix : public __node { public: __dot_suffix(__node* name, const char* suffix, unsigned sz) { __left_ = name; __name_ = suffix; __size_ = sz; } virtual size_t first_size() const { if (__cached_size_ == -1) { size_t off = __left_->size(); off += __size_ + 3; const_cast(__cached_size_) = off; } return __cached_size_; } virtual char* first_demangled_name(char* buf) const { buf = __left_->get_demangled_name(buf); *buf++ = ' '; *buf++ = '('; strncpy(buf, __name_, __size_); buf += __size_; *buf++ = ')'; return buf; } virtual ptrdiff_t print_first(char* f, char* l) const { const ptrdiff_t r = l - f; const ptrdiff_t n = 3 + __size_; const ptrdiff_t sz = __left_->print(f, l); if (r >= n + sz) { f += sz; *f++ = ' '; *f++ = '('; strncpy(f, __name_, __size_); f += __size_; *f = ')'; } return n + sz; } virtual __node* base_name() const { return __left_->base_name(); } virtual bool fix_forward_references(__node** t_begin, __node** t_end) { return __left_->fix_forward_references(t_begin, t_end); } }; enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success, not_yet_implemented}; __demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs) : __mangled_name_begin_(0), __mangled_name_end_(0), __status_(invalid_mangled_name), __root_(0), __node_begin_(0), __node_end_(0), __node_cap_(0), __sub_begin_(0), __sub_end_(0), __sub_cap_(0), __t_begin_(0), __t_end_(0), __t_cap_(0), __tag_templates_(true), __fix_forward_references_(false) { size_t n = strlen(mangled_name); size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*); char* m; if (ms <= bs) { m = buf; __owns_buf_ = false; } else { m = static_cast(malloc(ms)); __owns_buf_ = true; } if (m == NULL) { __status_ = memory_alloc_failure; return; } __node_begin_ = __node_end_ = (__node*)(m); __node_cap_ = __node_begin_ + 2*n; __sub_begin_ = __sub_end_ = (__node**)(__node_cap_); __sub_cap_ = __sub_begin_ + n; __t_begin_ = __t_end_ = (__node**)(__sub_cap_); __t_cap_ = __t_begin_ + n; __mangled_name_begin_ = (const char*)(__t_cap_); __mangled_name_end_ = __mangled_name_begin_ + n; strncpy(const_cast(__mangled_name_begin_), mangled_name, n); } __demangle_tree::~__demangle_tree() { if (__owns_buf_) free(__node_begin_); } __demangle_tree::__demangle_tree(__demangle_tree& t) : __mangled_name_begin_(t.__mangled_name_begin_), __mangled_name_end_(t.__mangled_name_end_), __status_(t.__status_), __root_(t.__root_), __node_begin_(t.__node_begin_), __node_end_(t.__node_end_), __node_cap_(t.__node_cap_), __sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_), __sub_cap_(t.__sub_cap_), __t_begin_(t.__t_begin_), __t_end_(t.__t_end_), __t_cap_(t.__t_cap_), __tag_templates_(t.__tag_templates_), __fix_forward_references_(t.__fix_forward_references_), __owns_buf_(t.__owns_buf_) { t.__mangled_name_begin_ = 0; t.__mangled_name_end_ = 0; t.__status_ = invalid_mangled_name; t.__root_ = 0; t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0; t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0; t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0; t.__owns_buf_ = false; } __demangle_tree::__demangle_tree(__demangle_tree_rv rv) : __mangled_name_begin_(rv.ptr_->__mangled_name_begin_), __mangled_name_end_(rv.ptr_->__mangled_name_end_), __status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_), __node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_), __node_cap_(rv.ptr_->__node_cap_), __sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_), __sub_cap_(rv.ptr_->__sub_cap_), __t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_), __t_cap_(rv.ptr_->__t_cap_), __tag_templates_(rv.ptr_->__tag_templates_), __fix_forward_references_(rv.ptr_->__fix_forward_references_), __owns_buf_(rv.ptr_->__owns_buf_) { rv.ptr_->__mangled_name_begin_ = 0; rv.ptr_->__mangled_name_end_ = 0; rv.ptr_->__status_ = invalid_mangled_name; rv.ptr_->__root_ = 0; rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0; rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0; rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0; rv.ptr_->__owns_buf_ = false; } int __demangle_tree::__status() const { return __status_; } size_t __demangle_tree::size() const { return __status_ == success ? __root_->size() : 0; } char* __demangle_tree::__get_demangled_name(char* buf) const { if (__status_ == success) return __root_->get_demangled_name(buf); return 0; } template bool __demangle_tree::__make() { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0, _A1 __a1) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0, __a1); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0, __a1, __a2); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } template bool __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4, _A5 __a5) { if (__node_end_ < __node_cap_) { ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5); __root_ = __node_end_; ++__node_end_; return true; } __status_ = memory_alloc_failure; return false; } // ::= [r] [V] [K] # restrict (C99), volatile, const // [R | O] # & or && const char* __demangle_tree::__parse_cv_qualifiers(const char* first, const char* last, unsigned& cv, bool look_for_ref_quals) { if (look_for_ref_quals) { for (; first != last; ++first) { switch (*first) { case 'r': cv |= 4; break; case 'V': cv |= 2; break; case 'K': cv |= 1; break; case 'R': cv |= 8; break; case 'O': cv |= 16; break; default: return first; } } } else { for (; first != last; ++first) { switch (*first) { case 'r': cv |= 4; break; case 'V': cv |= 2; break; case 'K': cv |= 1; break; default: return first; } } } return first; } // ::= v # void // ::= w # wchar_t // ::= b # bool // ::= c # char // ::= a # signed char // ::= h # unsigned char // ::= s # short // ::= t # unsigned short // ::= i # int // ::= j # unsigned int // ::= l # long // ::= m # unsigned long // ::= x # long long, __int64 // ::= y # unsigned long long, __int64 // ::= n # __int128 // ::= o # unsigned __int128 // ::= f # float // ::= d # double // ::= e # long double, __float80 // ::= g # __float128 // ::= z # ellipsis // ::= Dd # IEEE 754r decimal floating point (64 bits) // ::= De # IEEE 754r decimal floating point (128 bits) // ::= Df # IEEE 754r decimal floating point (32 bits) // ::= Dh # IEEE 754r half-precision floating point (16 bits) // ::= Di # char32_t // ::= Ds # char16_t // ::= Da # auto (in dependent new-expressions) // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) // ::= u # vendor extended type const char* __demangle_tree::__parse_builtin_type(const char* first, const char* last) { if (first != last) { switch (*first) { case 'v': if (__make<__void>()) ++first; break; case 'w': if (__make<__wchar_t>()) ++first; break; case 'b': if (__make<__bool>()) ++first; break; case 'c': if (__make<__char>()) ++first; break; case 'a': if (__make<__signed_char>()) ++first; break; case 'h': if (__make<__unsigned_char>()) ++first; break; case 's': if (__make<__short>()) ++first; break; case 't': if (__make<__unsigned_short>()) ++first; break; case 'i': if (__make<__int>()) ++first; break; case 'j': if (__make<__unsigned_int>()) ++first; break; case 'l': if (__make<__long>()) ++first; break; case 'm': if (__make<__unsigned_long>()) ++first; break; case 'x': if (__make<__long_long>()) ++first; break; case 'y': if (__make<__unsigned_long_long>()) ++first; break; case 'n': if (__make<__int128>()) ++first; break; case 'o': if (__make<__unsigned_int128>()) ++first; break; case 'f': if (__make<__float>()) ++first; break; case 'd': if (__make<__double>()) ++first; break; case 'e': if (__make<__long_double>()) ++first; break; case 'g': if (__make<__float128>()) ++first; break; case 'z': if (__make<__ellipsis>()) ++first; break; case 'D': if (first+1 != last) { switch (first[1]) { case 'd': if (__make<__decimal64>()) first += 2; break; case 'e': if (__make<__decimal128>()) first += 2; break; case 'f': if (__make<__decimal32>()) first += 2; break; case 'h': if (__make<__decimal16>()) first += 2; break; case 'i': if (__make<__d_char32_t>()) first += 2; break; case 's': if (__make<__d_char16_t>()) first += 2; break; case 'a': if (__make<__auto>()) first += 2; break; case 'n': if (__make<__nullptr_t>()) first += 2; break; } } break; } } return first; } // ::= + // # types are possible return type, then parameter types const char* __demangle_tree::__parse_bare_function_type(const char* first, const char* last) { if (first != last) { __tag_templates_ = false; const char* t = __parse_type(first, last); if (t != first && __make<__list>(__root_)) { const char* t0 = t; __node* head = __root_; __node* prev = head; while (true) { t = __parse_type(t0, last); if (t != t0) { if (__make<__list>(__root_)) { t0 = t; prev->__right_ = __root_; __root_->__size_ = prev->__size_ + 1; prev = __root_; } else break; } else { first = t; __root_ = head; break; } } } __tag_templates_ = true; } return first; } // ::= F [Y] E const char* __demangle_tree::__parse_function_type(const char* first, const char* last) { if (first != last && *first == 'F') { const char* t = first+1; if (t != last) { bool externC = false; if (*t == 'Y') { externC = true; if (++t == last) return first; } const char* t1 = __parse_type(t, last); if (t1 != t) { __node* ret = __root_; t = t1; t1 = __parse_bare_function_type(t, last); if (t1 != t && t1 != last && *t1 == 'E') { if (dynamic_cast<__void*>(__root_->__left_) != NULL) __root_->__left_ = NULL; if (__make<__function_signature>(ret, __root_)) { if (__make<__function>((__node*)0, __root_)) first = t1+1; } } } } } return first; } const char* __demangle_tree::__parse_hex_number(const char* first, const char* last, unsigned long long& n) { const char* t = first; for (; t != last && isxdigit(*t); ++t) { if (t == first) n = 0; if (isdigit(*t)) n = n * 16 + *t - '0'; else if (isupper(*t)) n = n * 16 + *t - 'A' + 10; else n = n * 16 + *t - 'a' + 10; } first = t; return first; } // ::= L E # integer literal // ::= L E # floating literal // ::= L E # string literal // ::= L E # nullptr literal (i.e., "LDnE") // ::= L _ E # complex floating point literal (C 2000) // ::= L E # external name const char* __demangle_tree::__parse_expr_primary(const char* first, const char* last) { if (last - first >= 4 && *first == 'L') { switch (first[1]) { case 'w': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__wchar_t_literal>(first+2, t)) first = t+1; } } break; case 'b': if (first[3] == 'E') { switch (first[2]) { case '0': if (__make<__bool_literal>("false", 5)) first += 4; break; case '1': if (__make<__bool_literal>("true", 4)) first += 4; break; } } break; case 'c': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__char_literal>(first+2, t)) first = t+1; } } break; case 'a': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__signed_char_literal>(first+2, t)) first = t+1; } } break; case 'h': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_char_literal>(first+2, t)) first = t+1; } } break; case 's': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__short_literal>(first+2, t)) first = t+1; } } break; case 't': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_short_literal>(first+2, t)) first = t+1; } } break; case 'i': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__int_literal>(first+2, t)) first = t+1; } } break; case 'j': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_int_literal>(first+2, t)) first = t+1; } } break; case 'l': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__long_literal>(first+2, t)) first = t+1; } } break; case 'm': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_long_literal>(first+2, t)) first = t+1; } } break; case 'x': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__long_long_literal>(first+2, t)) first = t+1; } } break; case 'y': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_long_long_literal>(first+2, t)) first = t+1; } } break; case 'n': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__int128_literal>(first+2, t)) first = t+1; } } break; case 'o': { const char* t = __parse_number(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__unsigned_int128_literal>(first+2, t)) first = t+1; } } break; case 'f': { if (last - (first+2) <= 8) return first; unsigned long long j; const char* t = __parse_hex_number(first+2, first+10, j); if (t != first+2 && t != last && *t == 'E') { unsigned i = static_cast(j); float value = *(float*)&i; if (__make<__float_literal>(value)) first = t+1; } } break; case 'd': { if (last - (first+2) <= 16) return first; unsigned long long j; const char* t = __parse_hex_number(first+2, first+18, j); if (t != first+2 && t != last && *t == 'E') { double value = *(double*)&j; if (__make<__double_literal>(value)) first = t+1; } } break; case 'e': break; case '_': if (first[2] == 'Z') { const char* t = __parse_encoding(first+3, last); if (t != first+3 && t != last && *t == 'E') first = t+1; } break; default: { // might be named type const char* t = __parse_type(first+1, last); if (t != first+1 && t != last) { if (*t != 'E') { const char* n = t; for (; n != last && isdigit(*n); ++n) ; if (n != t && n != last && *n == 'E') { if (__make<__cast_literal>(__root_, t, n)) { first = n+1; break; } } } else { first = t+1; break; } } } assert(!"case in __parse_expr_primary not implemented"); } } return first; } const char* __demangle_tree::__parse_unnamed_type_name(const char* first, const char* last) { if (first != last && *first == 'U') { assert(!"__parse_unnamed_type_name not implemented"); } return first; } // ::= C1 # complete object constructor // ::= C2 # base object constructor // ::= C3 # complete object allocating constructor // ::= D0 # deleting destructor // ::= D1 # complete object destructor // ::= D2 # base object destructor const char* __demangle_tree::__parse_ctor_dtor_name(const char* first, const char* last) { if (last-first >= 2) { switch (first[0]) { case 'C': switch (first[1]) { case '1': case '2': case '3': if (__make<__constructor>(__root_->base_name())) first += 2; break; } break; case 'D': switch (first[1]) { case '0': case '1': case '2': if (__make<__destructor>(__root_->base_name())) first += 2; break; } break; } } return first; } const char* __demangle_tree::__parse_unscoped_template_name(const char* first, const char* last) { assert(!"__parse_unscoped_template_name not implemented"); } // := _ # when number < 10 // := __ _ # when number >= 10 // extension := decimal-digit+ const char* __demangle_tree::__parse_discriminator(const char* first, const char* last) { // parse but ignore discriminator if (first != last) { if (*first == '_') { const char* t1 = first+1; if (t1 != last) { if (isdigit(*t1)) first = t1+1; else if (*t1 == '_') { for (++t1; t1 != last && isdigit(*t1); ++t1) ; if (t1 != last && *t1 == '_') first = t1 + 1; } } } else if (isdigit(*first)) { const char* t1 = first+1; for (; t1 != last && isdigit(*t1); ++t1) ; first = t1; } } return first; } // := Z E [] // := Z E s [] // := Z Ed [ ] _ const char* __demangle_tree::__parse_local_name(const char* first, const char* last) { if (first != last && *first == 'Z') { const char* t = __parse_encoding(first+1, last); if (t != first+1 && t != last && *t == 'E' && ++t != last) { __node* encoding = __root_; switch (*t) { case 's': { const char*t1 = __parse_discriminator(t+1, last); if (__make<__string_literal>()) { if (__make<__nested_delimeter>(encoding, __root_)) first = t1; } } break; case 'd': assert(!"__parse_local_name d not implemented"); break; default: { const char*t1 = __parse_name(t, last); if (t1 != t) { // parse but ignore discriminator t1 = __parse_discriminator(t1, last); if (__make<__nested_delimeter>(encoding, __root_)) first = t1; } } break; } } } return first; } // ::= # e.g., ~T or ~decltype(f()) // ::= # e.g., ~A<2*N> const char* __demangle_tree::__parse_destructor_name(const char* first, const char* last) { if (first != last) { const char* t = __parse_unresolved_type(first, last); if (t == first) t = __parse_simple_id(first, last); if (t != first && __make<__destructor>(__root_)) first = t; } return first; } // ::= [ ] const char* __demangle_tree::__parse_simple_id(const char* first, const char* last) { if (first != last) { const char* t = __parse_source_name(first, last); if (t != first) first = __parse_template_args(t, last); else first = t; } return first; } // ::= # unresolved name // extension ::= # unresolved operator-function-id // extension ::= # unresolved operator template-id // ::= on # unresolved operator-function-id // ::= on # unresolved operator template-id // ::= dn # destructor or pseudo-destructor; // # e.g. ~X or ~X const char* __demangle_tree::__parse_base_unresolved_name(const char* first, const char* last) { if (last - first >= 2) { if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n') { if (first[0] == 'o') { const char* t = __parse_operator_name(first+2, last); if (t != first+2) first = __parse_template_args(t, last); else first = t; } else { const char* t = __parse_destructor_name(first+2, last); if (t != first+2) first = t; } } else { const char* t = __parse_simple_id(first, last); if (t == first) { t = __parse_operator_name(first, last); if (t != first) t = __parse_template_args(t, last); } if (t != first) first = t; } } return first; } // ::= // ::= // ::= const char* __demangle_tree::__parse_unresolved_type(const char* first, const char* last) { if (first != last) { const char* t; switch (*first) { case 'T': t = __parse_template_param(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } break; case 'D': t = __parse_decltype(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } break; case 'S': t = __parse_substitution(first, last); if (t != first) first = t; break; } } return first; } // // ::= sr # extension, subtly different than srN ... // ::= sr # T::x / decltype(p)::x // # T::N::x /decltype(p)::N::x // ::= [gs] # x or (with "gs") ::x // ::= [gs] sr + E // # A::x, N::y, A::z; "gs" means leading "::" // (ignored) ::= srN + E const char* __demangle_tree::__parse_unresolved_name(const char* first, const char* last) { if (last - first > 2) { if (first[0] == 's' && first[1] == 'r') { const char* t = __parse_name(first+2, last); if (t == first+2) t = __parse_unresolved_type(first+2, last); if (t != first+2) { __node* name = __root_; const char* t2 = __parse_base_unresolved_name(t, last); if (t2 != t && __make<__unresolved_name>(name, __root_)) first = t2; } } else { const char* t = first; bool global = false; if (t[0] == 'g' && t[1] == 's') { global = true; t += 2; } if (last - t > 2) { const char* t2; __node* name = NULL; if (t[0] == 's' && t[1] == 'r') { t += 2; t2 = __parse_simple_id(t, last); if (t2 == t || t2 == last) return first; name = __root_; while (*t2 != 'E') { t = t2; t2 = __parse_simple_id(t, last); if (t2 == t) return first; if (!__make<__nested_delimeter>(name, __root_)) return first; name = __root_; } t = t2+1; } t2 = __parse_base_unresolved_name(t, last); if (t2 != t && __make<__unresolved_name>(global, name, __root_)) first = t2; } } } return first; } // ::= fp _ # L == 0, first parameter // ::= fp _ # L == 0, second and later parameters // ::= fL p _ # L > 0, first parameter // ::= fL p const char* __demangle_tree::__parse_function_param(const char* first, const char* last) { if (last - first >= 3 && *first == 'f') { if (first[1] == 'p') { assert(!"__parse_function_param not implemented"); } else if (first[1] == 'L') { assert(!"__parse_function_param not implemented"); } } return first; } // at # alignof (a type) const char* __demangle_tree::__parse_alignof_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'a' && first[1] == 't') { const char* t = __parse_type(first+2, last); if (t != first+2) { if (__make<__operator_alignof_expression>(__root_)) first = t; } } return first; } // cc # const_cast (expression) const char* __demangle_tree::__parse_const_cast_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') { const char* t = __parse_type(first+2, last); if (t != first+2) { __node* type = __root_; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__const_cast>(type, __root_)) first = t1; } } } return first; } // cl + E # call const char* __demangle_tree::__parse_call_expr(const char* first, const char* last) { if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (t == last) return first; __node* name = __root_; __node* args = 0; __node* prev = 0; while (*t != 'E') { const char* t1 = __parse_expression(t, last); if (t1 == t || t1 == last) return first; if (!__make<__list>(__root_)) return first; if (args == 0) args = __root_; if (prev) { prev->__right_ = __root_; __root_->__size_ = prev->__size_ + 1; } prev = __root_; t = t1; } ++t; if (__make<__call_expr>(name, args)) first = t; } } return first; } // cv # conversion with one argument // cv _ * E # conversion with a different number of arguments const char* __demangle_tree::__parse_conversion_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') { const char* t = __parse_type(first+2, last); if (t != first+2 && t != last) { __node* type = __root_; __node* args = 0; if (*t != '_') { const char* t1 = __parse_expression(t, last); if (t1 == t) return first; args = __root_; t = t1; } else { ++t; if (t == last) return first; __node* prev = 0; while (*t != 'E') { const char* t1 = __parse_expression(t, last); if (t1 == t || t1 == last) return first; if (!__make<__list>(__root_)) return first; if (args == 0) args = __root_; if (prev) { prev->__right_ = __root_; __root_->__size_ = prev->__size_ + 1; } prev = __root_; t = t1; } ++t; } if (__make<__operator_cast>(type, args)) first = t; } } return first; } // [gs] da # delete[] expression const char* __demangle_tree::__parse_delete_array_expr(const char* first, const char* last) { if (last - first >= 4) { const char* t = first; bool parsed_gs = false; if (t[0] == 'g' && t[1] == 's') { t += 2; parsed_gs = true; } if (t[0] == 'd' && t[1] == 'a') { t += 2; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__delete_array_expr>(parsed_gs, __root_)) first = t1; } } } return first; } // dc # dynamic_cast (expression) const char* __demangle_tree::__parse_dynamic_cast_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') { const char* t = __parse_type(first+2, last); if (t != first+2) { __node* type = __root_; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__dynamic_cast>(type, __root_)) first = t1; } } } return first; } // [gs] dl # delete expression const char* __demangle_tree::__parse_delete_expr(const char* first, const char* last) { if (last - first >= 4) { const char* t = first; bool parsed_gs = false; if (t[0] == 'g' && t[1] == 's') { t += 2; parsed_gs = true; } if (t[0] == 'd' && t[1] == 'l') { t += 2; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__delete_expr>(parsed_gs, __root_)) first = t1; } } } return first; } // ds # expr.*expr const char* __demangle_tree::__parse_dot_star_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'd' && first[1] == 's') { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* expr = __root_; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__dot_star_expr>(expr, __root_)) first = t1; } } } return first; } // dt # expr.name const char* __demangle_tree::__parse_dot_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'd' && first[1] == 't') { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* expr = __root_; const char* t1 = __parse_unresolved_name(t, last); if (t1 != t) { if (__make<__dot_expr>(expr, __root_)) first = t1; } } } return first; } // mm_ # prefix -- const char* __demangle_tree::__parse_decrement_expr(const char* first, const char* last) { if (last - first > 3 && first[0] == 'm' && first[1] == 'm' && first[2] == '_') { const char* t = __parse_expression(first+3, last); if (t != first+3) { if (__make<__operator_decrement>(true, __root_)) first = t; } } return first; } // pp_ # prefix ++ const char* __demangle_tree::__parse_increment_expr(const char* first, const char* last) { if (last - first > 3 && first[0] == 'p' && first[1] == 'p' && first[2] == '_') { const char* t = __parse_expression(first+3, last); if (t != first+3) { if (__make<__operator_increment>(true, __root_)) first = t; } } return first; } // [gs] nw * _ E # new (expr-list) type // [gs] nw * _ # new (expr-list) type (init) // [gs] na * _ E # new[] (expr-list) type // [gs] na * _ # new[] (expr-list) type (init) // ::= pi * E # parenthesized initialization const char* __demangle_tree::__parse_new_expr(const char* first, const char* last) { if (last - first >= 4) { const char* t = first; bool parsed_gs = false; if (t[0] == 'g' && t[1] == 's') { t += 2; parsed_gs = true; } if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a')) { bool is_array = t[1] == 'a'; t += 2; if (t == last) return first; __node* expr = 0; __node* prev = 0; while (*t != '_') { const char* t1 = __parse_expression(t, last); if (t1 == t || t1 == last) return first; if (!__make<__list>(__root_)) return first; if (expr == 0) expr = __root_; if (prev) { prev->__right_ = __root_; __root_->__size_ = prev->__size_ + 1; } prev = __root_; t = t1; } ++t; const char* t1 = __parse_type(t, last); if (t1 == t || t1 == last) return first; t = t1; __node* type = __root_; __node* init = 0; prev = 0; bool has_init = false; if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') { t += 2; has_init = true; while (*t != 'E') { t1 = __parse_expression(t, last); if (t1 == t || t1 == last) return first; if (!__make<__list>(__root_)) return first; if (init == 0) init = __root_; if (prev) { prev->__right_ = __root_; __root_->__size_ = prev->__size_ + 1; } prev = __root_; t = t1; } } if (*t != 'E') return first; if (__make<__new_expr>(parsed_gs, is_array, has_init, expr, type, init)) first = t; } } return first; } // pt # expr->name const char* __demangle_tree::__parse_arrow_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'p' && first[1] == 't') { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* expr = __root_; const char* t1 = __parse_unresolved_name(t, last); if (t1 != t) { if (__make<__arrow_expr>(expr, __root_)) first = t1; } } } return first; } // rc # reinterpret_cast (expression) const char* __demangle_tree::__parse_reinterpret_cast_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') { const char* t = __parse_type(first+2, last); if (t != first+2) { __node* type = __root_; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__reinterpret_cast>(type, __root_)) first = t1; } } } return first; } // sc # static_cast (expression) const char* __demangle_tree::__parse_static_cast_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 's' && first[1] == 'c') { const char* t = __parse_type(first+2, last); if (t != first+2) { __node* type = __root_; const char* t1 = __parse_expression(t, last); if (t1 != t) { if (__make<__static_cast>(type, __root_)) first = t1; } } } return first; } // st # sizeof (a type) const char* __demangle_tree::__parse_sizeof_type_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 's' && first[1] == 't') { const char* t = __parse_type(first+2, last); if (t != first+2) { if (__make<__operator_sizeof_expression>(__root_)) first = t; } } return first; } // sZ # size of a parameter pack const char* __demangle_tree::__parse_sizeof_param_pack_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T') { const char* t = __parse_template_param(first+2, last); if (t != first+2) { if (__make<__operator_sizeof_param_pack>(__root_)) first = t; } } return first; } // sZ # size of a function parameter pack const char* __demangle_tree::__parse_sizeof_function_param_pack_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f') { const char* t = __parse_function_param(first+2, last); if (t != first+2) { if (__make<__operator_sizeof_param_pack>(__root_)) first = t; } } return first; } // sp # pack expansion const char* __demangle_tree::__parse_pack_expansion(const char* first, const char* last) { if (last - first >= 3 && first[0] == 's' && first[1] == 'p') { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__pack_expansion>(__root_)) first = t; } } return first; } // te # typeid (expression) // ti # typeid (type) const char* __demangle_tree::__parse_typeid_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i')) { const char* t; if (first[1] == 'e') t = __parse_expression(first+2, last); else t = __parse_type(first+2, last); if (t != first+2) { if (__make<__typeid>(__root_)) first = t; } } return first; } // tw # throw expression const char* __demangle_tree::__parse_throw_expr(const char* first, const char* last) { if (last - first >= 3 && first[0] == 't' && first[1] == 'w') { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__throw>(__root_)) first = t; } } return first; } // ::= // ::= // ::= // ::= cl + E # call // ::= cv # conversion with one argument // ::= cv _ * E # conversion with a different number of arguments // ::= [gs] nw * _ E # new (expr-list) type // ::= [gs] nw * _ # new (expr-list) type (init) // ::= [gs] na * _ E # new[] (expr-list) type // ::= [gs] na * _ # new[] (expr-list) type (init) // ::= [gs] dl # delete expression // ::= [gs] da # delete[] expression // ::= pp_ # prefix ++ // ::= mm_ # prefix -- // ::= ti # typeid (type) // ::= te # typeid (expression) // ::= dc # dynamic_cast (expression) // ::= sc # static_cast (expression) // ::= cc # const_cast (expression) // ::= rc # reinterpret_cast (expression) // ::= st # sizeof (a type) // ::= at # alignof (a type) // ::= // ::= // ::= dt # expr.name // ::= pt # expr->name // ::= ds # expr.*expr // ::= sZ # size of a parameter pack // ::= sZ # size of a function parameter pack // ::= sp # pack expansion // ::= tw # throw expression // ::= tr # throw with no operand (rethrow) // ::= # f(p), N::f(p), ::f(p), // # freestanding dependent name (e.g., T::x), // # objectless nonstatic member reference // ::= const char* __demangle_tree::__parse_expression(const char* first, const char* last) { if (last - first >= 2) { const char* t = first; bool parsed_gs = false; if (last - first >= 4 && t[0] == 'g' && t[1] == 's') { t += 2; parsed_gs = true; } switch (*t) { case 'L': t = __parse_expr_primary(first, last); break; case 'T': t = __parse_template_param(first, last); break; case 'f': t = __parse_function_param(first, last); break; case 'a': if (t[1] == 't') t = __parse_alignof_expr(first, last); break; case 'c': switch (t[1]) { case 'c': t = __parse_const_cast_expr(first, last); break; case 'l': t = __parse_call_expr(first, last); break; case 'v': t = __parse_conversion_expr(first, last); break; } break; case 'd': switch (t[1]) { case 'a': t = __parse_delete_array_expr(first, last); break; case 'c': t = __parse_dynamic_cast_expr(first, last); break; case 'l': t = __parse_delete_expr(first, last); break; case 's': t = __parse_dot_star_expr(first, last); break; case 't': t = __parse_dot_expr(first, last); break; } break; case 'm': t = __parse_decrement_expr(first, last); break; case 'n': switch (t[1]) { case 'a': case 'w': t = __parse_new_expr(first, last); break; } break; case 'p': switch (t[1]) { case 'p': t = __parse_increment_expr(first, last); break; case 't': t = __parse_arrow_expr(first, last); break; } break; case 'r': t = __parse_reinterpret_cast_expr(first, last); break; case 's': switch (t[1]) { case 'c': t = __parse_static_cast_expr(first, last); break; case 'p': t = __parse_pack_expansion(first, last); break; case 't': t = __parse_sizeof_type_expr(first, last); break; case 'Z': if (last - t >= 3) { switch (t[2]) { case 'T': t = __parse_sizeof_param_pack_expr(first, last); break; case 'f': t = __parse_sizeof_function_param_pack_expr(first, last); break; } } break; } break; case 't': switch (t[1]) { case 'e': case 'i': t = __parse_typeid_expr(first, last); break; case 'r': if (__make<__rethrow>()) t = first +2; break; case 'w': t = __parse_throw_expr(first, last); break; } break; } if ((!parsed_gs && t == first) || (parsed_gs && t == first+2)) { int op; t = __parse_operator_name(first, last, &op); if (t == first) first = __parse_unresolved_name(first, last); else first = t; } else first = t; } return first; } // ::= A _ // ::= A [] _ const char* __demangle_tree::__parse_array_type(const char* first, const char* last) { if (first != last && *first == 'A' && first+1 != last) { if (first[1] == '_') { const char* t = __parse_type(first+2, last); if (t != first+2) { if (__make<__array>(__root_)) first = t; } } else if ('1' <= first[1] && first[1] <= '9') { size_t dim = first[1] - '0'; const char* t = first+2; for (; t != last && isdigit(*t); ++t) dim = dim * 10 + *t - '0'; if (t != last && *t == '_') { const char* t2 = __parse_type(t+1, last); if (t2 != t+1) { if (__make<__array>(__root_, dim)) first = t2; } } } else { const char* t = __parse_expression(first+1, last); if (t != first+1 && t != last && *t == '_') { __node* dim = __root_; const char* t2 = __parse_type(++t, last); if (t2 != t) { if (__make<__array>(__root_, dim)) first = t2; } } } } return first; } // ::= const char* __demangle_tree::__parse_class_enum_type(const char* first, const char* last) { return __parse_name(first, last); } // ::= M const char* __demangle_tree::__parse_pointer_to_member_type(const char* first, const char* last) { if (first != last && *first == 'M') { const char* t = __parse_type(first+1, last); if (t != first+1) { __node* class_type = __root_; const char* t2 = __parse_type(t, last, true, true); if (t2 != t) { if (__make<__pointer_to_member_type>(class_type, __root_)) first = t2; } } } return first; } // ::= Dt E # decltype of an id-expression or class member access (C++0x) // ::= DT E # decltype of an expression (C++0x) const char* __demangle_tree::__parse_decltype(const char* first, const char* last) { if (last - first >= 4 && first[0] == 'D') { switch (first[1]) { case 't': case 'T': { const char* t = __parse_expression(first+2, last); if (t != first+2 && t != last && *t == 'E') { if (__make<__decltype_node>(__root_)) first = t+1; } } break; } } return first; } // ::= T_ # first template parameter // ::= T _ const char* __demangle_tree::__parse_template_param(const char* first, const char* last) { if (last - first >= 2) { if (*first == 'T') { if (first[1] == '_') { if (__t_begin_ != __t_end_) { if (__make<__sub>(*__t_begin_)) first += 2; } else { if (__make<__sub>(size_t(0))) { first += 2; __fix_forward_references_ = true; } } } else if (isdigit(first[1])) { const char* t = first+1; size_t sub = *t - '0'; for (++t; t != last && isdigit(*t); ++t) { sub *= 10; sub += *t - '0'; } if (t == last || *t != '_') return first; ++sub; if (sub < __t_end_ - __t_begin_) { if (__make<__sub>(__t_begin_[sub])) first = t+1; } else { if (__make<__sub>(sub)) { first = t+1; __fix_forward_references_ = true; } } } } } return first; } // ::= // ::= // ::= // ::= // ::= // ::= // ::= // ::= // ::= // ::= // ::= P # pointer-to // ::= R # reference-to // ::= O # rvalue reference-to (C++0x) // ::= C # complex pair (C 2000) // ::= G # imaginary (C 2000) // ::= Dp # pack expansion (C++0x) // ::= U # vendor extended type qualifier const char* __demangle_tree::__parse_type(const char* first, const char* last, bool try_to_parse_template_args, bool look_for_ref_quals) { unsigned cv = 0; const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals); if (t != first) { const char* t2 = __parse_type(t, last, try_to_parse_template_args); if (t2 != t) { if (__make<__cv_qualifiers>(cv, __root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t2; } } } return first; } if (first != last) { switch (*first) { case 'A': t = __parse_array_type(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } break; case 'C': t = __parse_type(first+1, last, try_to_parse_template_args); if (t != first+1) { if (__make<__d_complex>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 'F': t = __parse_function_type(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } break; case 'G': t = __parse_type(first+1, last, try_to_parse_template_args); if (t != first+1) { if (__make<__imaginary>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 'M': t = __parse_pointer_to_member_type(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } break; case 'O': t = __parse_type(first+1, last, try_to_parse_template_args); if (t != first+1) { if (__make<__rvalue_reference_to>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 'P': t = __parse_type(first+1, last, try_to_parse_template_args); if (t != first+1) { if (__make<__pointer_to>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 'R': t = __parse_type(first+1, last, try_to_parse_template_args); if (t != first+1) { if (__make<__lvalue_reference_to>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 'T': t = __parse_template_param(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; if (try_to_parse_template_args) { __node* temp = __root_; const char* t2 = __parse_template_args(t, last); if (t2 != t) { if (__sub_end_ < __sub_cap_) { *__sub_end_++ = __root_; first = t2; } else __status_ = memory_alloc_failure; } else { first = t; } } else { first = t; } } } break; case 'U': if (first+1 != last) { t = __parse_source_name(first+1, last); if (t != first+1) { __node* name = __root_; const char* t2 = __parse_type(t, last, try_to_parse_template_args); if (t2 != t) { if (__make<__extended_qualifier>(name, __root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t2; } } return first; } } } break; case 'S': if (first+1 != last && first[1] == 't') { t = __parse_class_enum_type(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } } else { t = __parse_substitution(first, last); if (t != first) { first = t; // Parsed a substitution. If the substitution is a // it might be followed by . t = __parse_template_args(first, last); if (t != first) { // Need to create substitution for if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } } } break; case 'D': if (first+1 != last) { switch (first[1]) { case 'p': t = __parse_type(first+2, last, try_to_parse_template_args); if (t != first+1) { if (__make<__pack_expansion>(__root_)) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } return first; } break; case 't': case 'T': t = __parse_decltype(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } return first; } break; } } // drop through default: // must check for builtin-types before class-enum-types to avoid // ambiguities with operator-names t = __parse_builtin_type(first, last); if (t != first) { first = t; } else { t = __parse_class_enum_type(first, last); if (t != first) { if (__sub_end_ == __sub_cap_) __status_ = memory_alloc_failure; else { *__sub_end_++ = __root_; first = t; } } } break; } } return first; } // ::= [n] const char* __demangle_tree::__parse_number(const char* first, const char* last) { if (first != last) { const char* t = first; if (*t == 'n') ++t; if (t != last) { if (*t == '0') { first = t+1; } else if ('1' <= *t && *t <= '9') { first = t+1; while (first != last && isdigit(*first)) ++first; } } } return first; } // ::= h _ // ::= v _ // // ::= // # non-virtual base override // // ::= _ // # virtual base override, with vcall offset const char* __demangle_tree::__parse_call_offset(const char* first, const char* last) { if (first != last) { switch (*first) { case 'h': { const char* t = __parse_number(first + 1, last); if (t != first + 1 && t != last && *t == '_') first = t + 1; } break; case 'v': { const char* t = __parse_number(first + 1, last); if (t != first + 1 && t != last && *t == '_') { const char* t2 = __parse_number(++t, last); if (t2 != t && t2 != last && *t2 == '_') first = t2 + 1; } } break; } } return first; } // ::= TV # virtual table // ::= TT # VTT structure (construction vtable index) // ::= TI # typeinfo structure // ::= TS # typeinfo name (null-terminated byte string) // ::= Tc // # base is the nominal target function of thunk // # first call-offset is 'this' adjustment // # second call-offset is result adjustment // ::= T // # base is the nominal target function of thunk // ::= GV # Guard variable for one-time initialization // # No const char* __demangle_tree::__parse_special_name(const char* first, const char* last) { if (last - first > 2) { const char* t; switch (*first) { case 'T': switch (first[1]) { case 'V': // TV # virtual table t = __parse_type(first+2, last); if (t != first+2 && __make<__vtable>(__root_)) first = t; break; case 'T': // TT # VTT structure (construction vtable index) t = __parse_type(first+2, last); if (t != first+2 && __make<__VTT>(__root_)) first = t; break; case 'I': // TI # typeinfo structure t = __parse_type(first+2, last); if (t != first+2 && __make<__typeinfo>(__root_)) first = t; break; case 'S': // TS # typeinfo name (null-terminated byte string) t = __parse_type(first+2, last); if (t != first+2 && __make<__typeinfo_name>(__root_)) first = t; break; case 'c': // Tc { const char* t0 = __parse_call_offset(first+2, last); if (t0 == first+2) break; const char* t1 = __parse_call_offset(t0, last); if (t1 == t0) break; t = __parse_encoding(t1, last); if (t != t1 && __make<__covariant_return_thunk>(__root_)) first = t; } break; default: // T { const char* t0 = __parse_call_offset(first+1, last); if (t0 == first+1) break; t = __parse_encoding(t0, last); if (t != t0) { if (first[2] == 'v') { if (__make<__virtual_thunk>(__root_)) first = t; } else { if (__make<__non_virtual_thunk>(__root_)) first = t; } } } break; } break; case 'G': if (first[1] == 'V') { // GV # Guard variable for one-time initialization t = __parse_name(first+2, last); if (t != first+2 && __make<__guard_variable>(__root_)) first = t; } break; } } return first; } // // ::= aa # && // ::= ad # & (unary) // ::= an # & // ::= aN # &= // ::= aS # = // ::= at # alignof (a type) // ::= az # alignof (an expression) // ::= cl # () // ::= cm # , // ::= co # ~ // ::= cv # (cast) // ::= da # delete[] // ::= de # * (unary) // ::= dl # delete // ::= dv # / // ::= dV # /= // ::= eo # ^ // ::= eO # ^= // ::= eq # == // ::= ge # >= // ::= gt # > // ::= ix # [] // ::= le # <= // ::= ls # << // ::= lS # <<= // ::= lt # < // ::= mi # - // ::= mI # -= // ::= ml # * // ::= mL # *= // ::= mm # -- (postfix in context) // ::= na # new[] // ::= ne # != // ::= ng # - (unary) // ::= nt # ! // ::= nw # new // ::= oo # || // ::= or # | // ::= oR # |= // ::= pm # ->* // ::= pl # + // ::= pL # += // ::= pp # ++ (postfix in context) // ::= ps # + (unary) // ::= pt # -> // ::= qu # ? // ::= rm # % // ::= rM # %= // ::= rs # >> // ::= rS # >>= // ::= st # sizeof (a type) // ::= sz # sizeof (an expression) // ::= v # vendor extended operator const char* __demangle_tree::__parse_operator_name(const char* first, const char* last, int* type) { if (last - first >= 2) { switch (*first) { case 'a': switch (first[1]) { case 'a': // && if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_logical_and>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_logical_and>()) first += 2; } break; case 'd': // & (unary) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_addressof>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_addressof>()) first += 2; } break; case 'n': // & if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_bit_and>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_bit_and>()) first += 2; } break; case 'N': // &= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_and_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_and_equal>()) first += 2; } break; case 'S': // = if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_equal>()) first += 2; } break; case 't': // alignof (a type) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_alignof_type>(__root_)) { *type = -1; first = t; } } } else { if (__make<__operator_alignof_type>()) first += 2; } break; case 'z': // alignof (an expression) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_alignof_expression>(__root_)) { *type = -1; first = t; } } } else { if (__make<__operator_alignof_expression>()) first += 2; } break; } break; case 'c': switch (first[1]) { case 'l': // () if (__make<__operator_paren>()) { first += 2; if (type) *type = -1; } break; case 'm': // , if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_comma>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_comma>()) first += 2; } break; case 'o': // ~ if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_tilda>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_tilda>()) first += 2; } break; case 'v': // cast { const char* t = __parse_type(first+2, last, false); if (t != first+2) { __node* cast_type = __root_; if (type) { const char* t2 = __parse_expression(t, last); if (t2 != t) { if (__make<__operator_cast>(cast_type, __root_)) { *type = -1; first = t2; } } } else { if (__make<__operator_cast>(cast_type)) first = t; } } } break; } break; case 'd': switch (first[1]) { case 'a': // delete[] if (__make<__operator_delete_array>()) { first += 2; if (type) *type = -1; } break; case 'e': // * (unary) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_dereference>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_dereference>()) first += 2; } break; case 'l': // delete if (__make<__operator_delete>()) { first += 2; if (type) *type = -1; } break; case 'v': // / if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_divide>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_divide>()) first += 2; } break; case 'V': // /= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_divide_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_divide_equal>()) first += 2; } break; } break; case 'e': switch (first[1]) { case 'o': // ^ if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_xor>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_xor>()) first += 2; } break; case 'O': // ^= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_xor_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_xor_equal>()) first += 2; } break; case 'q': // == if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_equality>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_equality>()) first += 2; } break; } break; case 'g': switch (first[1]) { case 'e': // >= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_greater_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_greater_equal>()) first += 2; } break; case 't': // > if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_greater>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_greater>()) first += 2; } break; } break; case 'i': // [] if (first[1] == 'x' && __make<__operator_brackets>()) { first += 2; if (type) *type = -1; } break; case 'l': switch (first[1]) { case 'e': // <= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_less_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_less_equal>()) first += 2; } break; case 's': // << if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_left_shift>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_left_shift>()) first += 2; } break; case 'S': // <<= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_left_shift_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_left_shift_equal>()) first += 2; } break; case 't': // < if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_less>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_less>()) first += 2; } break; } break; case 'm': switch (first[1]) { case 'i': // - if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_minus>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_minus>()) first += 2; } break; case 'I': // -= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_minus_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_minus_equal>()) first += 2; } break; case 'l': // * if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_times>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_times>()) first += 2; } break; case 'L': // *= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_times_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_times_equal>()) first += 2; } break; case 'm': // -- (postfix in context) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_decrement>(false, __root_)) { *type = 1; first = t; } } } else { if (__make<__operator_decrement>()) first += 2; } break; } break; case 'n': switch (first[1]) { case 'a': // new[] if (__make<__operator_new_array>()) { first += 2; if (type) *type = -1; } break; case 'e': // != if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_not_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_not_equal>()) first += 2; } break; case 'g': // - (unary) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_negate>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_negate>()) first += 2; } break; case 't': // ! if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_logical_not>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_logical_not>()) first += 2; } break; case 'w': // new if (__make<__operator_new>()) { first += 2; if (type) *type = -1; } break; } break; case 'o': switch (first[1]) { case 'o': // || if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_logical_or>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_logical_or>()) first += 2; } break; case 'r': // | if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_bit_or>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_bit_or>()) first += 2; } break; case 'R': // |= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_or_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_or_equal>()) first += 2; } break; } break; case 'p': switch (first[1]) { case 'm': // ->* if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_pointer_to_member>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_pointer_to_member>()) first += 2; } break; case 'l': // + if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_plus>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_plus>()) first += 2; } break; case 'L': // += if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_plus_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_plus_equal>()) first += 2; } break; case 'p': // ++ (postfix in context) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_increment>(false, __root_)) { *type = 1; first = t; } } } else { if (__make<__operator_increment>()) first += 2; } break; case 's': // + (unary) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_unary_plus>(__root_)) { *type = 1; first = t; } } } else { if (__make<__operator_unary_plus>()) first += 2; } break; case 't': // -> if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_arrow>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_arrow>()) first += 2; } break; } break; case 'q': // ? if (first[1] == 'u') { if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { __node* op2 = __root_; const char* t3 = __parse_expression(t2, last); if (t3 != t2) { if (__make<__operator_conditional>(op1, op2, __root_)) { *type = 3; first = t3; } } } } } else { if (__make<__operator_conditional>()) first += 2; } } break; case 'r': switch (first[1]) { case 'm': // % if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_mod>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_mod>()) first += 2; } break; case 'M': // %= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_mod_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_mod_equal>()) first += 2; } break; case 's': // >> if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_right_shift>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_right_shift>()) first += 2; } break; case 'S': // >>= if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { __node* op1 = __root_; const char* t2 = __parse_expression(t, last); if (t != t2) { if (__make<__operator_right_shift_equal>(op1, __root_)) { *type = 2; first = t2; } } } } else { if (__make<__operator_right_shift_equal>()) first += 2; } break; } break; case 's': switch (first[1]) { case 't': // sizeof (a type) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_sizeof_type>(__root_)) { *type = -1; first = t; } } } else { if (__make<__operator_sizeof_type>()) first += 2; } break; case 'z': // sizeof (an expression) if (type) { const char* t = __parse_expression(first+2, last); if (t != first+2) { if (__make<__operator_sizeof_expression>(__root_)) { *type = -1; first = t; } } } else { if (__make<__operator_sizeof_expression>()) first += 2; } break; } break; } } return first; } // ::= const char* __demangle_tree::__parse_source_name(const char* first, const char* last) { if (first != last) { char c = *first; if ('1' <= c && c <= '9' && first+1 != last) { const char* t = first+1; size_t n = c - '0'; for (c = *t; '0' <= c && c <= '9'; c = *t) { n = n * 10 + c - '0'; if (++t == last) return first; } if (last - t >= n && __make<__source_name>(t, n)) first = t + n; } } return first; } // ::= // ::= // ::= // ::= const char* __demangle_tree::__parse_unqualified_name(const char* first, const char* last) { const char* t = __parse_source_name(first, last); if (t == first) { t = __parse_ctor_dtor_name(first, last); if (t == first) { t = __parse_operator_name(first, last); if (t == first) first = __parse_unnamed_type_name(first, last); else first = t; } else first = t; } else first = t; return first; } // ::= // ::= St # ::std:: // extension ::= StL const char* __demangle_tree::__parse_unscoped_name(const char* first, const char* last) { if (last - first >= 2) { const char* t0 = first; if (first[0] == 'S' && first[1] == 't') { t0 += 2; if (t0 != last && *t0 == 'L') ++t0; } const char* t1 = __parse_unqualified_name(t0, last); if (t1 != t0) { if (t0 != first) { __node* name = __root_; if (__make<__std_qualified_name>()) { if (__make<__nested_delimeter>(__root_, name)) first = t1; } } else first = t1; } } return first; } // ::= N [] E // ::= N [] E // // ::= // ::= // ::= // ::= // ::= # empty // ::= // ::= // extension ::= L // // ::=