diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:11 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:11 +0100 |
commit | 4538829ab86b5a1cd4e845e7eab165029c9d6d46 (patch) | |
tree | bbadf39aed0610c8f8f7b41fefff47773b8ac205 /libcutl/cutl/compiler | |
parent | 23d41842168ac1a1580111b9c5c73500ceee3d57 (diff) | |
parent | aad5ad9bf0c02aa4e79bc6b7d6c934612fff4026 (diff) |
Update upstream source from tag 'upstream/4.2.0'
Update to upstream version '4.2.0'
with Debian dir 1b38df7bbcf313223de3c50107ac0255090fe647
Diffstat (limited to 'libcutl/cutl/compiler')
-rw-r--r-- | libcutl/cutl/compiler/code-stream.hxx | 154 | ||||
-rw-r--r-- | libcutl/cutl/compiler/code-stream.txx | 95 | ||||
-rw-r--r-- | libcutl/cutl/compiler/context.cxx | 54 | ||||
-rw-r--r-- | libcutl/cutl/compiler/context.hxx | 137 | ||||
-rw-r--r-- | libcutl/cutl/compiler/context.txx | 88 | ||||
-rw-r--r-- | libcutl/cutl/compiler/cxx-indenter.cxx | 49 | ||||
-rw-r--r-- | libcutl/cutl/compiler/cxx-indenter.hxx | 171 | ||||
-rw-r--r-- | libcutl/cutl/compiler/cxx-indenter.ixx | 69 | ||||
-rw-r--r-- | libcutl/cutl/compiler/cxx-indenter.txx | 817 | ||||
-rw-r--r-- | libcutl/cutl/compiler/sloc-counter.hxx | 78 | ||||
-rw-r--r-- | libcutl/cutl/compiler/sloc-counter.txx | 224 | ||||
-rw-r--r-- | libcutl/cutl/compiler/traversal.hxx | 171 | ||||
-rw-r--r-- | libcutl/cutl/compiler/traversal.txx | 144 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-id.hxx | 48 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-id.ixx | 44 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-id.txx | 17 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-info.cxx | 30 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-info.hxx | 111 | ||||
-rw-r--r-- | libcutl/cutl/compiler/type-info.ixx | 95 |
19 files changed, 0 insertions, 2596 deletions
diff --git a/libcutl/cutl/compiler/code-stream.hxx b/libcutl/cutl/compiler/code-stream.hxx deleted file mode 100644 index bfd33d0..0000000 --- a/libcutl/cutl/compiler/code-stream.hxx +++ /dev/null @@ -1,154 +0,0 @@ -// file : cutl/compiler/code-stream.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_CODE_STREAM_HXX -#define CUTL_COMPILER_CODE_STREAM_HXX - -#include <memory> // std::auto_ptr -#include <ostream> - -#include <cutl/exception.hxx> - -namespace cutl -{ - namespace compiler - { - // - // - template <typename C> - class code_stream - { - public: - code_stream () {} - - virtual - ~code_stream (); - - public: - virtual void - put (C) = 0; - - // Unbuffer flushes internal formatting buffers (if any). - // Note that unbuffer is not exactly flushing since it can - // result in formatting errors and in general can not be - // called at arbitrary points. Natural use case would be - // to call unbuffer at the end of the stream when no more - // data is expected. - // - virtual void - unbuffer () = 0; - - private: - code_stream (code_stream const&); - - code_stream& - operator= (code_stream const&); - }; - - // - // - template <typename C> - class from_streambuf_adapter: public code_stream<C> - { - public: - typedef typename std::basic_streambuf<C>::traits_type traits_type; - typedef typename std::basic_streambuf<C>::int_type int_type; - - class eof: exception {}; - class sync: exception {}; - - public: - from_streambuf_adapter (std::basic_streambuf<C>& stream) - : stream_ (stream) - { - } - - private: - from_streambuf_adapter (from_streambuf_adapter const&); - - from_streambuf_adapter& - operator= (from_streambuf_adapter const&); - - public: - virtual void - put (C c); - - virtual void - unbuffer (); - - private: - std::basic_streambuf<C>& stream_; - }; - - // - // - template <typename C> - class to_streambuf_adapter: public std::basic_streambuf<C> - { - public: - typedef typename std::basic_streambuf<C>::traits_type traits_type; - typedef typename std::basic_streambuf<C>::int_type int_type; - - public: - to_streambuf_adapter (code_stream<C>& stream) - : stream_ (stream) - { - } - - private: - to_streambuf_adapter (to_streambuf_adapter const&); - - to_streambuf_adapter& - operator= (to_streambuf_adapter const&); - - public: - virtual int_type - overflow (int_type i); - - // Does nothing since calling unbuffer here would be dangerous. - // See the note in code_stream. - // - virtual int - sync (); - - private: - code_stream<C>& stream_; - }; - - // - // - template <template <typename> class S, typename C> - class ostream_filter - { - public: - typedef S<C> stream_type; - - ostream_filter (std::basic_ostream<C>& os); - ~ostream_filter (); - - stream_type& - stream () - { - return stream_; - } - - private: - ostream_filter (ostream_filter const&); - - ostream_filter& - operator= (ostream_filter const&); - - private: - std::basic_ostream<C>& os_; - std::basic_streambuf<C>* prev_; - from_streambuf_adapter<C> from_adapter_; - stream_type stream_; - to_streambuf_adapter<C> to_adapter_; - }; - } -} - -#include <cutl/compiler/code-stream.txx> - -#endif // CUTL_COMPILER_CODE_STREAM_HXX diff --git a/libcutl/cutl/compiler/code-stream.txx b/libcutl/cutl/compiler/code-stream.txx deleted file mode 100644 index 232c5cc..0000000 --- a/libcutl/cutl/compiler/code-stream.txx +++ /dev/null @@ -1,95 +0,0 @@ -// file : cutl/compiler/code-stream.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - // code_stream - // - - template <typename C> - code_stream<C>::~code_stream () - { - } - - // from_streambuf_adapter - // - - template <typename C> - void from_streambuf_adapter<C>:: - put (C c) - { - int_type i (stream_.sputc (c)); - - if (i == traits_type::eof ()) - throw eof (); - } - - template <typename C> - void from_streambuf_adapter<C>:: - unbuffer () - { - if (stream_.pubsync () != 0) - throw sync (); - } - - // to_streambuf_adapter - // - - template <typename C> - typename to_streambuf_adapter<C>::int_type to_streambuf_adapter<C>:: - overflow (int_type i) - { - try - { - stream_.put (traits_type::to_char_type (i)); - return i; - } - catch (typename from_streambuf_adapter<C>::eof const&) - { - return traits_type::eof (); - } - } - - template <typename C> - int to_streambuf_adapter<C>:: - sync () - { - return 0; - } - - // ostream_filter - // - - template <template <typename> class S, typename C> - ostream_filter<S, C>:: - ostream_filter (std::basic_ostream<C>& os) - : os_ (os), - prev_ (os_.rdbuf ()), - from_adapter_ (*prev_), - stream_ (from_adapter_), - to_adapter_ (stream_) - { - os_.rdbuf (&to_adapter_); - } - - template <template <typename> class S, typename C> - ostream_filter<S, C>:: - ~ostream_filter () - { - try - { - stream_.unbuffer (); - } - catch (...) - { - os_.rdbuf (prev_); - throw; - } - - os_.rdbuf (prev_); - } - } -} diff --git a/libcutl/cutl/compiler/context.cxx b/libcutl/cutl/compiler/context.cxx deleted file mode 100644 index 51311fc..0000000 --- a/libcutl/cutl/compiler/context.cxx +++ /dev/null @@ -1,54 +0,0 @@ -// file : cutl/compiler/context.cxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include <cutl/compiler/context.hxx> - -using namespace std; - -namespace cutl -{ - namespace compiler - { - void context:: - set (string const& key, container::any const& value) - { - using container::any; - - std::pair<map::iterator, bool> r ( - map_.insert (map::value_type (key, value))); - - any& x (r.first->second); - - if (!r.second) - { - if (value.type_info () != x.type_info ()) - throw typing (); - - x = value; - } - } - - void context:: - remove (string const& key) - { - map::iterator i (map_.find (key)); - - if (i == map_.end ()) - throw no_entry (); - - map_.erase (i); - } - - type_info const& context:: - type_info (string const& key) const - { - map::const_iterator i (map_.find (key)); - - if (i == map_.end ()) - throw no_entry (); - - return i->second.type_info (); - } - } -} diff --git a/libcutl/cutl/compiler/context.hxx b/libcutl/cutl/compiler/context.hxx deleted file mode 100644 index 2933e36..0000000 --- a/libcutl/cutl/compiler/context.hxx +++ /dev/null @@ -1,137 +0,0 @@ -// file : cutl/compiler/context.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_CONTEXT_HXX -#define CUTL_COMPILER_CONTEXT_HXX - -#include <map> -#include <string> -#include <cstddef> // std::size_t -#include <typeinfo> - -#include <cutl/exception.hxx> -#include <cutl/container/any.hxx> - -#include <cutl/details/export.hxx> - -namespace cutl -{ - namespace compiler - { - class LIBCUTL_EXPORT context - { - public: - struct LIBCUTL_EXPORT no_entry: exception {}; - struct LIBCUTL_EXPORT typing: exception {}; - - public: - context () {} - - void - swap (context& c) - { - map_.swap (c.map_); - } - - private: - context (context const&); - - context& - operator= (context const&); - - public: - std::size_t - count (char const* key) const - { - return count (std::string (key)); - } - - std::size_t - count (std::string const& key) const - { - return map_.count (key); - } - - template <typename X> - X& - get (char const* key) - { - return get<X> (std::string (key)); - } - - template <typename X> - X& - get (std::string const& key); - - template <typename X> - X const& - get (char const* key) const - { - return get<X> (std::string (key)); - } - - template <typename X> - X const& - get (std::string const& key) const; - - template <typename X> - X const& - get (char const* key, X const& default_value) const - { - return get<X> (std::string (key), default_value); - } - - template <typename X> - X const& - get (std::string const& key, X const& default_value) const; - - template <typename X> - X& - set (char const* key, X const& value) - { - return set<X> (std::string (key), value); - } - - template <typename X> - X& - set (std::string const& key, X const& value); - - void - set (char const* key, container::any const& value) - { - return set (std::string (key), value); - } - - void - set (std::string const& key, container::any const& value); - - void - remove (char const* key) - { - remove (std::string (key)); - } - - void - remove (std::string const& key); - - std::type_info const& - type_info (char const* key) const - { - return type_info (std::string (key)); - } - - std::type_info const& - type_info (std::string const& key) const; - - private: - typedef std::map<std::string, container::any> map; - - map map_; - }; - } -} - -#include <cutl/compiler/context.txx> - -#endif // CUTL_COMPILER_CONTEXT_HXX diff --git a/libcutl/cutl/compiler/context.txx b/libcutl/cutl/compiler/context.txx deleted file mode 100644 index 53edcda..0000000 --- a/libcutl/cutl/compiler/context.txx +++ /dev/null @@ -1,88 +0,0 @@ -// file : cutl/compiler/context.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - template <typename X> - X& context:: - get (std::string const& key) - { - map::iterator i (map_.find (key)); - - if (i == map_.end ()) - throw no_entry (); - - try - { - return i->second. template value<X> (); - } - catch (container::any::typing const&) - { - throw typing (); - } - } - - template <typename X> - X const& context:: - get (std::string const& key) const - { - map::const_iterator i (map_.find (key)); - - if (i == map_.end ()) - throw no_entry (); - - try - { - return i->second. template value<X> (); - } - catch (container::any::typing const&) - { - throw typing (); - } - } - - template <typename X> - X const& context:: - get (std::string const& key, X const& default_value) const - { - map::const_iterator i (map_.find (key)); - - if (i == map_.end ()) - return default_value; - - try - { - return i->second. template value<X> (); - } - catch (container::any::typing const&) - { - throw typing (); - } - } - - template <typename X> - X& context:: - set (std::string const& key, X const& value) - { - try - { - std::pair<map::iterator, bool> r ( - map_.insert (map::value_type (key, value))); - - X& x (r.first->second. template value<X> ()); - - if (!r.second) - x = value; - - return x; - } - catch (container::any::typing const&) - { - throw typing (); - } - } - } -} diff --git a/libcutl/cutl/compiler/cxx-indenter.cxx b/libcutl/cutl/compiler/cxx-indenter.cxx deleted file mode 100644 index dba9f09..0000000 --- a/libcutl/cutl/compiler/cxx-indenter.cxx +++ /dev/null @@ -1,49 +0,0 @@ -// file : cutl/compiler/cxx-indenter.cxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include <cutl/compiler/cxx-indenter.hxx> - -namespace cutl -{ - namespace compiler - { - template<> - char const* cxx_indenter<char>:: - keyword (cxx_indenter<char>::keyword_type t) - { - static char const* keywords[] = - { - "if", - "do", - "for", - "else", - "case", - "while", - "catch", - "default" - }; - - return keywords[t]; - } - - template<> - wchar_t const* cxx_indenter<wchar_t>:: - keyword (cxx_indenter<wchar_t>::keyword_type t) - { - static wchar_t const* keywords[] = - { - L"if", - L"do", - L"for", - L"else", - L"case", - L"while", - L"catch", - L"default" - }; - - return keywords[t]; - } - } -} diff --git a/libcutl/cutl/compiler/cxx-indenter.hxx b/libcutl/cutl/compiler/cxx-indenter.hxx deleted file mode 100644 index eac2952..0000000 --- a/libcutl/cutl/compiler/cxx-indenter.hxx +++ /dev/null @@ -1,171 +0,0 @@ -// file : cutl/compiler/cxx-indenter.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_CXX_INDENTER_HXX -#define CUTL_COMPILER_CXX_INDENTER_HXX - -#include <set> -#include <stack> -#include <deque> -#include <string> -#include <cstddef> // std::size_t - -#include <cutl/compiler/code-stream.hxx> - -namespace cutl -{ - namespace compiler - { - template <typename C> - class cxx_indenter: public code_stream<C> - { - public: - cxx_indenter (code_stream<C>& out); - - private: - cxx_indenter (cxx_indenter const&); - - cxx_indenter& - operator= (cxx_indenter const&); - - public: - virtual void - put (C); - - virtual void - unbuffer (); - - private: - typedef std::basic_string<C> string; - - enum construct - { - con_other, - con_pp_dir, - con_c_com, - con_cxx_com, - con_string_lit, - con_char_lit - }; - - private: - void - next_token (string const& old, C); - - void - ensure_new_line (); - - void - output_indentation (); - - void - write (C); - - private: - void - tokenize (C, construct old); - - void - retire (C); - - private: - enum char_class_type - { - cc_alpha, // Alpha + '_'. - cc_digit, - cc_op_punc, // Operator or punctuation. - cc_space - }; - - static char_class_type - char_class (C); - - private: - enum keyword_type - { - kw_if, - kw_do, - kw_for, - kw_else, - kw_case, - kw_while, - kw_catch, - kw_default - }; - - static C const* - keyword (keyword_type); - - private: - code_stream<C>& out_; - bool buffering_; // True if write() should buffer the char. - std::size_t position_; // Current position on the line. - std::size_t paren_balance_; // ( ) balance. - std::stack<std::size_t> indentation_; - std::size_t spaces_; - bool suppress_nl_; - construct construct_; - - // Special state stack for the do-while construct. The presence - // of an element in the stack indicates that we are in a braced - // do-while construct. The value of the element is the brace - // balance. - std::stack<std::size_t> do_while_state_; - - typedef std::deque<C> hold; - hold hold_; - - private: - string token_; // previously fully recognized token - string lexeme_; // current lexeme (accumulator) - - // Keywords that may be folowed by a single-line block, e.g., if, - // else, etc. - // - std::set<string> single_line_blocks_; - - // Keywords that may follow (and be related) to a previous block, - // e.g., else, case, catch. - // - std::set<string> follow_blocks_; - - string do_; - string lbrace_; - string rbrace_; - - private: - // Single-line indented blocks such as if, else, while, etc. The - // newline flag indicates whether a new line has been seen after - // the keyword. This is needed to properly distinguish cases such - // as: - // - // else if (...) - // foo (); - // - // else - // if (...) - // foo (); - // - struct indent_block - { - indent_block (bool newline, std::size_t indentation) - : newline_ (newline), indentation_ (indentation) - { - } - - bool newline_; - std::size_t indentation_; // Size of the indentation_ stack - // corresponding to this block, or - // 0 if it is not indented. - }; - - std::stack<indent_block> indent_stack_; - }; - } -} - -#include <cutl/compiler/cxx-indenter.ixx> -#include <cutl/compiler/cxx-indenter.txx> - -#endif // CUTL_COMPILER_CXX_INDENTER_HXX diff --git a/libcutl/cutl/compiler/cxx-indenter.ixx b/libcutl/cutl/compiler/cxx-indenter.ixx deleted file mode 100644 index 74bfac3..0000000 --- a/libcutl/cutl/compiler/cxx-indenter.ixx +++ /dev/null @@ -1,69 +0,0 @@ -// file : cutl/compiler/cxx-indenter.ixx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - template <typename C> - inline typename cxx_indenter<C>::char_class_type cxx_indenter<C>:: - char_class (C c) - { - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - return cc_digit; - - case '!': - case '%': - case '^': - case '&': - case '*': - case '(': - case ')': - case '-': - case '+': - case '=': - case '{': - case '}': - case '|': - case '~': - case '[': - case ']': - case '\\': - case ';': - case '\'': - case ':': - case '"': - case '<': - case '>': - case '?': - case ',': - case '.': - case '/': - return cc_op_punc; - - case ' ': - case '\n': - case '\t': - case '\f': - case '\r': - case '\v': - return cc_space; - - default: - return cc_alpha; - } - } - } -} diff --git a/libcutl/cutl/compiler/cxx-indenter.txx b/libcutl/cutl/compiler/cxx-indenter.txx deleted file mode 100644 index c3930b3..0000000 --- a/libcutl/cutl/compiler/cxx-indenter.txx +++ /dev/null @@ -1,817 +0,0 @@ -// file : cutl/compiler/cxx-indenter.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - template <typename C> - cxx_indenter<C>:: - cxx_indenter (code_stream<C>& out) - : out_ (out), - buffering_ (false), - position_ (0), - paren_balance_ (0), - spaces_ (2), - construct_ (con_other), - do_ (keyword(kw_do)), - lbrace_ (1, '{'), - rbrace_ (1, '}') - { - indentation_.push (0); - - single_line_blocks_.insert (keyword(kw_if)); - single_line_blocks_.insert (keyword(kw_do)); - single_line_blocks_.insert (keyword(kw_for)); - single_line_blocks_.insert (keyword(kw_else)); - single_line_blocks_.insert (keyword(kw_case)); - single_line_blocks_.insert (keyword(kw_while)); - - follow_blocks_.insert (keyword(kw_else)); - follow_blocks_.insert (keyword(kw_case)); - follow_blocks_.insert (keyword(kw_catch)); - follow_blocks_.insert (keyword(kw_default)); - } - - template <typename C> - void cxx_indenter<C>:: - put (C c) - { - // First determine what kind of construct we are in. - // - construct new_con (construct_); - construct old_con (construct_); - - switch (c) - { - case '\n': - { - if (construct_ == con_pp_dir || - construct_ == con_cxx_com) - construct_ = new_con = con_other; - - break; - } - case '#': - { - if (construct_ == con_other) - construct_ = new_con = con_pp_dir; - - break; - } - case '\"': - { - if (construct_ != con_pp_dir && - construct_ != con_c_com && - construct_ != con_cxx_com && - construct_ != con_char_lit) - { - // We might be in an escape sequence. - // - bool es (!hold_.empty () && hold_.back () == '\\'); - - if (es) - { - // Scan the hold sequence backwards to figure out if this - // backslash is part of this escape sequence or a preceding - // one. - // - for (typename hold::reverse_iterator i (hold_.rbegin () + 1), - e (hold_.rend ()); i != e && *i == '\\'; ++i) - es = !es; - } - - if (!es) - { - if (construct_ == con_string_lit) - new_con = con_other; - else - construct_ = new_con = con_string_lit; - } - } - - break; - } - case '\'': - { - if (construct_ != con_pp_dir && - construct_ != con_c_com && - construct_ != con_cxx_com && - construct_ != con_string_lit) - { - // We might be in an escape sequence. - // - bool es (!hold_.empty () && hold_.back () == '\\'); - - if (es) - { - // Scan the hold sequence backwards to figure out if this - // backslash is part of this escape sequence or a preceding - // one. - // - for (typename hold::reverse_iterator i (hold_.rbegin () + 1), - e (hold_.rend ()); i != e && *i == '\\'; ++i) - es = !es; - } - - if (!es) - { - if (construct_ == con_char_lit) - new_con = con_other; - else - construct_ = new_con = con_char_lit; - } - } - - break; - } - case '/': - { - if (construct_ == con_other) - { - if (!hold_.empty () && hold_.back () == '/') - construct_ = new_con = con_cxx_com; - } - - if (construct_ == con_c_com) - { - if (!hold_.empty () && hold_.back () == '*') - construct_ = new_con = con_other; - } - - break; - } - case '*': - { - if (construct_ == con_other) - { - if (!hold_.empty () && hold_.back () == '/') - construct_ = new_con = con_c_com; - } - - break; - } - default: - { - break; - } - } - - // Special handling of CPP directives. - // - if (construct_ == con_pp_dir) - { - write (c); - position_++; - return; - } - - // - // - tokenize (c, old_con); - - - // Indentation in parenthesis. We don't need to make sure - // we are not in a comments, etc., because we make sure we - // don't hold anything in those states. - // - if (!hold_.empty () && hold_.back () == '(') - { - unbuffer (); // We don't need to hold it anymore. - - if (c == '\n') - indentation_.push (indentation_.top () + spaces_); - else - indentation_.push (position_); - } - - - // - // - bool defaulting (false); - - switch (c) - { - case '\n': - { - if (!indent_stack_.empty () && construct_ == con_other) - indent_stack_.top ().newline_ = true; - - hold_.push_back (c); - position_ = 0; // Starting a new line. - - break; - } - case '{': - { - if (construct_ == con_other) - { - if (!indent_stack_.empty ()) - { - // Pop all the blocks until the one that was indented. - // - while (indent_stack_.top ().indentation_ == 0) - indent_stack_.pop (); - - // Pop the indented block and one level of indentation. - // - if (indentation_.size () > 1) - indentation_.pop (); - - indent_stack_.pop (); - } - - ensure_new_line (); - output_indentation (); - write (c); - ensure_new_line (); - - indentation_.push (indentation_.top () + spaces_); - } - else - defaulting = true; - - break; - } - case '}': - { - if (construct_ == con_other) - { - if (indentation_.size () > 1) - indentation_.pop (); - - // Reduce multiple newlines to one. - // - while (hold_.size () > 1) - { - typename hold::reverse_iterator i (hold_.rbegin ()); - - if (*i == '\n' && *(i + 1) == '\n') - hold_.pop_back (); - else - break; - } - - ensure_new_line (); - output_indentation (); - - hold_.push_back (c); - - // Add double newline after '}'. - // - hold_.push_back ('\n'); - hold_.push_back ('\n'); - position_ = 0; - - if (!indent_stack_.empty ()) - { - // Pop all the blocks until the one that was indented. - // - while (indent_stack_.top ().indentation_ == 0) - indent_stack_.pop (); - - // Now pop all the indented blocks while also popping the - // indentation stack. Do it only if the indentation match. - // If it doesn't then that means this inden_stack entry is - // for some other, outer block. - // - while (!indent_stack_.empty () && - indent_stack_.top ().indentation_ == - indentation_.size ()) - { - if (indentation_.size () > 1) - indentation_.pop (); - - indent_stack_.pop (); - } - } - - buffering_ = true; - } - else - defaulting = true; - - break; - } - case ';': - { - if (construct_ == con_other) - { - // for (;;) - // - if (!indent_stack_.empty () && paren_balance_ == 0) - { - // Pop all the blocks until the one that was indented. - // - while (indent_stack_.top ().indentation_ == 0) - indent_stack_.pop (); - - // Now pop all the indented blocks while also popping the - // indentation stack. Do it only if the indentation match. - // If they don't then it means we are inside a block and - // the stack should be popped after seeing '}', not ';'. - // - while (!indent_stack_.empty () && - indent_stack_.top ().indentation_ == - indentation_.size ()) - { - if (indentation_.size () > 1) - indentation_.pop (); - - indent_stack_.pop (); - } - } - - if (paren_balance_ != 0) - { - // We are inside for (;;) statement. Nothing to do here. - // - defaulting = true; - } - else - { - // Handling '};' case. - // - - bool brace (false); - - if (hold_.size () > 1 && hold_.back () == '\n') - { - bool pop_nl (false); - - for (typename hold::reverse_iterator - i (hold_.rbegin ()), e (hold_.rend ()); - i != e; ++i) - { - if (*i != '\n') - { - if (*i == '}') - brace = pop_nl = true; - - break; - } - } - - if (pop_nl) - while (hold_.back () == '\n') - hold_.pop_back (); - } - - output_indentation (); - write (c); - position_++; - - if (brace) - { - hold_.push_back ('\n'); - hold_.push_back ('\n'); - } - - ensure_new_line (); - } - } - else - defaulting = true; - - break; - } - case ',': - { - if (construct_ == con_other) - { - // Handling '},' case. - // - - bool brace (false); - - if (hold_.size () > 1 && hold_.back () == '\n') - { - bool pop_nl (false); - - for (typename hold::reverse_iterator - i (hold_.rbegin ()), e (hold_.rend ()); - i != e; ++i) - { - if (*i != '\n') - { - if (*i == '}') - brace = pop_nl = true; - - break; - } - } - - if (pop_nl) - while (hold_.back () == '\n') - hold_.pop_back (); - } - - output_indentation (); - write (c); - position_++; - - if (brace) - hold_.push_back ('\n'); - } - else - defaulting = true; - - break; - } - case ' ': - { - if (construct_ == con_other) - { - // Handling '} foo_;' case. - // - if (hold_.size () > 1 && hold_.back () == '\n') - { - bool pop_nl (false); - - for (typename hold::reverse_iterator - i (hold_.rbegin ()), e (hold_.rend ()); - i != e; ++i) - { - if (*i != '\n') - { - if (*i == '}') - pop_nl = true; - - break; - } - } - - if (pop_nl) - while (hold_.back () == '\n') - hold_.pop_back (); - } - } - - defaulting = true; - break; - } - case '\\': - { - if (construct_ != con_pp_dir && - construct_ != con_c_com && - construct_ != con_cxx_com) - { - output_indentation (); - hold_.push_back (c); - position_++; - } - else - defaulting = true; - - break; - - } - case '(': - { - if (construct_ == con_other) - { - // Hold it so that we can see what's coming next. - // - output_indentation (); - hold_.push_back (c); - position_++; - paren_balance_++; - } - else - defaulting = true; - break; - } - case ')': - { - if (construct_ == con_other) - { - if (indentation_.size () > 1) - indentation_.pop (); - - if (paren_balance_ > 0) - paren_balance_--; - } - - defaulting = true; - break; - } - case '/': - { - if (construct_ == con_other) - { - output_indentation (); - hold_.push_back (c); - position_++; - } - else - defaulting = true; - - break; - } - case '*': - { - if (construct_ == con_c_com) - { - output_indentation (); - hold_.push_back (c); - position_++; - } - else - defaulting = true; - - break; - } - default: - { - defaulting = true; - break; - } - } - - if (defaulting) - { - output_indentation (); - write (c); - position_++; - } - - construct_ = new_con; - } - - template <typename C> - void cxx_indenter<C>:: - unbuffer () - { - for (; !hold_.empty (); hold_.pop_front ()) - out_.put (hold_.front ()); - } - - template <typename C> - void cxx_indenter<C>:: - next_token (string const& old, C c) - { - // Handle one line indentation blocks (if, else, etc). - // - if (single_line_blocks_.find (token_) != single_line_blocks_.end ()) - { - // Only indent sub-blocks if we are on a new line. - // - bool indent (indent_stack_.empty () || - indent_stack_.top ().newline_); - - if (indent) - indentation_.push (indentation_.top () + spaces_); - - indent_stack_.push ( - indent_block (c == '\n', (indent ? indentation_.size () : 0))); - } - - // Keep track of the do ... while construct in order to suppress - // the newline after } and before while. - // - if (old == do_ && token_ == lbrace_) - do_while_state_.push (0); - - if (!do_while_state_.empty ()) - { - if (token_ == lbrace_) - do_while_state_.top ()++; - - if (token_ == rbrace_) - do_while_state_.top ()--; - } - - // Suppress double newline in the "}else", etc., cases. - // - if (old == rbrace_) - { - bool dw (!do_while_state_.empty () && do_while_state_.top () == 0); - - if (follow_blocks_.find (token_) != follow_blocks_.end () || dw) - { - if (dw) - do_while_state_.pop (); - - // Reduce double newline after "}" into a single one. - // - typename hold::iterator i (hold_.end ()), b (hold_.begin ()); - - for (--i; i != b; --i) - { - // See if this is the end of the "}\n\n" sequence. - // - if (*i == '\n') - { - --i; - if (i != b && *i == '\n') - { - --i; - if (*i == '}') - { - ++i; - hold_.erase (i); - break; - } - } - } - } - } - - // Stop buffering unless we have another closing brace. - // - if (token_ != rbrace_) - buffering_ = false; - } - } - - template <typename C> - void cxx_indenter<C>:: - ensure_new_line () - { - if (hold_.empty () || hold_.back () != '\n') - { - hold_.push_back ('\n'); - position_ = 0; // Starting a new line. - } - } - - - template <typename C> - void cxx_indenter<C>:: - output_indentation () - { - if (!hold_.empty () && hold_.back () == '\n') - { - for (std::size_t i (0); i < indentation_.top (); ++i) - write (' '); - - position_ += indentation_.top (); - } - } - - template <typename C> - void cxx_indenter<C>:: - write (C c) - { - hold_.push_back (c); - - if (!buffering_) - { - for (; !hold_.empty (); hold_.pop_front ()) - out_.put (hold_.front ()); - } - } - - template <typename C> - void cxx_indenter<C>:: - tokenize (C c, construct old) - { - // - // - switch (construct_) - { - case con_pp_dir: - { - if (old == con_other) // Start PP directive - retire (c); - - return; - } - case con_c_com: - { - if (old == con_other) // Start C comment. - lexeme_.clear (); - - return; - } - case con_cxx_com: - { - if (old == con_other) // Start C++ comment. - lexeme_.clear (); - - return; - } - case con_string_lit: - { - if (old == con_other) // Start string literal - retire (c); - - lexeme_ += c; - return; - } - case con_char_lit: - { - if (old == con_other) // Start char literal - retire (c); - - lexeme_ += c; - return; - } - default: - break; - } - - // construct_ == other - // - switch (old) - { - case con_pp_dir: - { - // End PP directive (newline). - // - return; - } - case con_c_com: - { - // End C comment. - // - return; - } - case con_cxx_com: - { - // End C++ comment (newline). - // - return; - } - case con_string_lit: - { - // End string literal ("). - // - lexeme_ += c; - return; - } - case con_char_lit: - { - // End char literal ('). - // - lexeme_ += c; - return; - } - default: - break; - } - - - // construct_ == old == other - // - - switch (char_class (c)) - { - case cc_alpha: - { - if (lexeme_.empty () || - char_class (lexeme_[0]) == cc_alpha) - lexeme_ += c; - else - { - retire (c); - lexeme_ += c; - } - break; - } - case cc_digit: - { - if (lexeme_.empty ()) - lexeme_ += c; - else - { - char_class_type cc (char_class (lexeme_[0])); - - if (cc == cc_alpha || cc == cc_digit) - lexeme_ += c; - else - { - retire (c); - lexeme_ += c; - } - } - break; - } - case cc_op_punc: - { - retire (c); - lexeme_ += c; - break; - } - case cc_space: - { - retire (c); - break; - } - } - } - - template <typename C> - void cxx_indenter<C>:: - retire (C c) - { - if (!lexeme_.empty ()) - { - token_.swap (lexeme_); - next_token (lexeme_, c); - lexeme_.clear (); - } - } - } -} diff --git a/libcutl/cutl/compiler/sloc-counter.hxx b/libcutl/cutl/compiler/sloc-counter.hxx deleted file mode 100644 index cbcdede..0000000 --- a/libcutl/cutl/compiler/sloc-counter.hxx +++ /dev/null @@ -1,78 +0,0 @@ -// file : cutl/compiler/sloc-counter.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_SLOC_COUNTER_HXX -#define CUTL_COMPILER_SLOC_COUNTER_HXX - -#include <cstddef> // std::size_t - -#include <cutl/compiler/code-stream.hxx> - -namespace cutl -{ - namespace compiler - { - template <typename C> - class sloc_counter: public code_stream<C> - { - public: - sloc_counter (code_stream<C>& out); - - std::size_t - count () const - { - return count_; - } - - private: - sloc_counter (sloc_counter const&); - - sloc_counter& - operator= (sloc_counter const&); - - public: - virtual void - put (C); - - virtual void - unbuffer (); - - private: - void - code (C); - - void - c_comment (C); - - void - cxx_comment (C); - - void - char_literal (C); - - void - string_literal (C); - - private: - code_stream<C>& out_; - std::size_t count_; - - C prev_; // Previous character or '\0'. - bool code_counted_; // This code line has already been counted. - - enum construct - { - con_code, - con_c_com, - con_cxx_com, - con_char_lit, - con_string_lit - } construct_; - }; - } -} - -#include <cutl/compiler/sloc-counter.txx> - -#endif // CUTL_COMPILER_SLOC_COUNTER_HXX diff --git a/libcutl/cutl/compiler/sloc-counter.txx b/libcutl/cutl/compiler/sloc-counter.txx deleted file mode 100644 index 3b741ad..0000000 --- a/libcutl/cutl/compiler/sloc-counter.txx +++ /dev/null @@ -1,224 +0,0 @@ -// file : cutl/compiler/sloc-counter.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include <cctype> // std::isspace - -namespace cutl -{ - namespace compiler - { - template <typename C> - sloc_counter<C>:: - sloc_counter (code_stream<C>& out) - : out_ (out), - count_ (0), - prev_ ('\0'), - code_counted_ (false), - construct_ (con_code) - { - } - - template <typename C> - void sloc_counter<C>:: - put (C c) - { - construct old (construct_); - - switch (construct_) - { - case con_code: - { - code (c); - break; - } - case con_c_com: - { - c_comment (c); - break; - } - case con_cxx_com: - { - cxx_comment (c); - break; - } - case con_char_lit: - { - char_literal (c); - break; - } - case con_string_lit: - { - string_literal (c); - break; - } - } - - // There are cases when a previous character has been already - // 'used' and therefore can not be used again. Good example - // would be '/* *//'. Here, the second slash doesn't start - // C++ comment since it was already used by C comment. - // - // To account for this we are going to set prev_ to '\0' when - // the mode changes. - // - - prev_ = (old == construct_) ? c : '\0'; - - out_.put (c); - } - - template <typename C> - void sloc_counter<C>:: - unbuffer () - { - } - - template <typename C> - void sloc_counter<C>:: - code (C c) - { - bool count (true); - - switch (c) - { - case '/': - { - if (prev_ == '/') - { - construct_ = con_cxx_com; - count = false; - } - else - { - // This slash can be a beginning of a comment but we - // yet have no way to know. Will have to examine it later - // (see below). - // - count = false; - } - - break; - } - case '*': - { - if (prev_ == '/') - { - construct_ = con_c_com; - count = false; - } - break; - } - case '\'': - { - construct_ = con_char_lit; - break; - } - case '"': - { - construct_ = con_string_lit; - break; - } - case '\n': - { - code_counted_ = false; // Reset for a new line. - count = false; - break; - } - default: - { - if (std::isspace (c)) - count = false; - break; - } - } - - if (!code_counted_) - { - if (count) - { - count_++; - code_counted_ = true; - } - else if (prev_ == '/' && construct_ == con_code) - { - // This condition accounts for the fact that we cannot count - // '/' right away since it can be a beginning of a comment. - // - count_++; - code_counted_ = (c != '\n'); - } - } - } - - template <typename C> - void sloc_counter<C>:: - c_comment (C c) - { - switch (c) - { - case '/': - { - if (prev_ == '*') - construct_ = con_code; - break; - } - case '\n': - { - code_counted_ = false; // Reset for a new line. - break; - } - } - } - - template <typename C> - void sloc_counter<C>:: - cxx_comment (C c) - { - switch (c) - { - case '\n': - { - construct_ = con_code; - code_counted_ = false; // Reset for a new line. - break; - } - } - } - - template <typename C> - void sloc_counter<C>:: - char_literal (C c) - { - switch (c) - { - case '\'': - { - if (prev_ != '\\') - construct_ = con_code; - break; - } - } - } - - template <typename C> - void sloc_counter<C>:: - string_literal (C c) - { - switch (c) - { - case '"': - { - if (prev_ != '\\') - construct_ = con_code; - break; - } - case '\n': - { - count_++; - break; - } - } - } - } -} diff --git a/libcutl/cutl/compiler/traversal.hxx b/libcutl/cutl/compiler/traversal.hxx deleted file mode 100644 index e0b6d77..0000000 --- a/libcutl/cutl/compiler/traversal.hxx +++ /dev/null @@ -1,171 +0,0 @@ -// file : cutl/compiler/traversal.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_TRAVERSAL_HXX -#define CUTL_COMPILER_TRAVERSAL_HXX - -#include <map> -#include <set> -#include <vector> - -#include <cutl/compiler/type-info.hxx> - -namespace cutl -{ - namespace compiler - { - // - // - template<typename B> - class traverser - { - public: - virtual - ~traverser (); - - virtual void - trampoline (B&) = 0; - }; - - // - // - template<typename B> - class traverser_map - { - public: - typedef std::vector<traverser<B>*> traversers; - - struct map_type: std::map<type_id, traversers> - { - map_type () {} - - // Don't copy traverser maps. We do it here instead of in - // traverser_map to pacify GCC's -Wextra insisting we must - // explicitly initialize virtual bases in copy constructor. - // - map_type (map_type const&): std::map<type_id, traversers> () {} - map_type& operator= (map_type const&) {return *this;} - }; - - typedef typename map_type::const_iterator iterator; - - iterator - begin () const - { - return map_.begin (); - } - - iterator - end () const - { - return map_.end (); - } - - void - add (type_id const& id, traverser<B>& t) - { - traversers& travs (map_[id]); - travs.push_back (&t); - } - - protected: - map_type map_; - }; - - // - // - template <typename X, typename B> - class traverser_impl: public traverser<B>, - public virtual traverser_map<B> - { - public: - typedef X type; - - traverser_impl () - { - this->add (typeid (type), *this); - } - - traverser_impl (traverser_impl const&) - { - this->add (typeid (type), *this); - } - - virtual void - traverse (type&) = 0; - - public: - virtual void - trampoline (B&); - }; - - // - // - template <typename B> - class dispatcher: public virtual traverser_map<B> - { - public: - virtual - ~dispatcher (); - - void - traverser (traverser_map<B>&); - - virtual void - dispatch (B&); - - public: - template <typename I, typename X> - static void - iterate_and_dispatch (I begin, I end, dispatcher<X>& d) - { - for (; begin != end; ++begin) - { - d.dispatch (*begin); - } - } - - template <typename T, typename A, typename I, typename X> - static void - iterate_and_dispatch (I begin, - I end, - dispatcher<X>& d, - T& t, - void (T::*next)(A&), - A& a) - { - for (; begin != end;) - { - d.dispatch (*begin); - - if (++begin != end && next != 0) - (t.*next) (a); - } - } - - private: - struct comparator - { - bool - operator () (type_info const& a, type_info const& b) const - { - return a.type_id () < b.type_id (); - } - }; - - typedef std::map<type_info, std::size_t, comparator> level_map; - typedef std::set<type_info, comparator> type_info_set; - - static std::size_t - compute_levels (type_info const&, std::size_t current, level_map&); - - static void - flatten_tree (type_info const&, type_info_set&); - }; - } -} - -#include <cutl/compiler/traversal.txx> - -#endif // CUTL_COMPILER_TRAVERSAL_HXX diff --git a/libcutl/cutl/compiler/traversal.txx b/libcutl/cutl/compiler/traversal.txx deleted file mode 100644 index 21200bc..0000000 --- a/libcutl/cutl/compiler/traversal.txx +++ /dev/null @@ -1,144 +0,0 @@ -// file : cutl/compiler/traversal.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - // traverser - // - template<typename B> - traverser<B>:: - ~traverser () - { - } - - // traverser_impl - // - - template <typename X, typename B> - void traverser_impl<X, B>:: - trampoline (B& x) - { - this->traverse (dynamic_cast<type&> (x)); - } - - // dispatcher - // - - template <typename B> - dispatcher<B>:: - ~dispatcher () - { - } - - template <typename B> - void dispatcher<B>:: - traverser (traverser_map<B>& m) - { - // Copy entries from m to our map. - // - for (typename traverser_map<B>::iterator - i (m.begin ()), e (m.end ()); i != e; ++i) - { - typename traverser_map<B>::traversers& travs (this->map_[i->first]); - - for (typename traverser_map<B>::traversers::const_iterator - t (i->second.begin ()), e (i->second.end ()); t != e; ++t) - { - travs.push_back (*t); - } - } - } - - template <typename B> - void dispatcher<B>:: - dispatch (B& x) - { - using std::size_t; - - level_map levels; - type_info const& ti (lookup (x)); - size_t max (compute_levels (ti, 0, levels)); - - // cerr << "starting dispatch process for " << ti.type_id ().name () - // << " with " << max << " levels" << endl; - - for (size_t l (0); l < max + 1; ++l) - { - type_info_set dispatched; - - for (typename level_map::const_iterator - i (levels.begin ()), e (levels.end ()); i != e; ++i) - { - if (i->second == l) - { - typename traverser_map<B>::map_type::const_iterator v ( - this->map_.find (i->first.type_id ())); - - if (v != this->map_.end ()) - { - // cerr << "dispatching traversers for " << ti.type_id ().name () - // << " as " << i->first.type_id ().name () << endl; - - typename traverser_map<B>::traversers const& travs (v->second); - - for (typename traverser_map<B>::traversers::const_iterator - ti (travs.begin ()), te (travs.end ()); ti != te; ++ti) - { - (*ti)->trampoline (x); - } - - flatten_tree (i->first, dispatched); - } - } - } - - // Remove traversed types from the level map. - // - for (typename type_info_set::const_iterator i (dispatched.begin ()); - i != dispatched.end (); ++i) - { - levels.erase (*i); - } - } - } - - template <typename B> - std::size_t dispatcher<B>:: - compute_levels (type_info const& ti, std::size_t cur, level_map& map) - { - using std::size_t; - - size_t ret (cur); - - if (map.find (ti) == map.end () || map[ti] < cur) - map[ti] = cur; - - for (type_info::base_iterator i (ti.begin_base ()); - i != ti.end_base (); ++i) - { - size_t tmp (compute_levels (i->type_info (), cur + 1, map)); - - if (tmp > ret) - ret = tmp; - } - - return ret; - } - - template <typename B> - void dispatcher<B>:: - flatten_tree (type_info const& ti, type_info_set& set) - { - set.insert (ti); - - for (type_info::base_iterator i (ti.begin_base ()); - i != ti.end_base (); ++i) - { - flatten_tree (i->type_info (), set); - } - } - } -} diff --git a/libcutl/cutl/compiler/type-id.hxx b/libcutl/cutl/compiler/type-id.hxx deleted file mode 100644 index f37454e..0000000 --- a/libcutl/cutl/compiler/type-id.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// file : cutl/compiler/type-id.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_TYPE_ID_HXX -#define CUTL_COMPILER_TYPE_ID_HXX - -#include <typeinfo> // std::type_info - -#include <cutl/details/export.hxx> - -namespace cutl -{ - namespace compiler - { - class LIBCUTL_EXPORT type_id - { - public: - template<typename X> - type_id (X const volatile&); - - type_id (std::type_info const&); - - public: - char const* - name () const; - - friend bool - operator== (type_id const&, type_id const&); - - friend bool - operator!= (type_id const&, type_id const&); - - friend bool - operator< (type_id const&, type_id const&); - - private: - std::type_info const* ti_; - }; - - typedef type_id type_id_t; - } -} - -#include <cutl/compiler/type-id.ixx> -#include <cutl/compiler/type-id.txx> - -#endif // CUTL_COMPILER_TYPE_ID_HXX diff --git a/libcutl/cutl/compiler/type-id.ixx b/libcutl/cutl/compiler/type-id.ixx deleted file mode 100644 index 2e9f963..0000000 --- a/libcutl/cutl/compiler/type-id.ixx +++ /dev/null @@ -1,44 +0,0 @@ -// file : cutl/compiler/type-id.ixx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - inline - type_id:: - type_id (std::type_info const& ti) - : ti_ (&ti) - { - } - - inline - char const* type_id:: - name () const - { - return ti_->name (); - } - - inline - bool - operator== (type_id const& x, type_id const& y) - { - return *x.ti_ == *y.ti_; - } - - inline - bool - operator!= (type_id const& x, type_id const& y) - { - return *x.ti_ != *y.ti_; - } - - inline - bool - operator< (type_id const& x, type_id const& y) - { - return x.ti_->before (*y.ti_); - } - } -} diff --git a/libcutl/cutl/compiler/type-id.txx b/libcutl/cutl/compiler/type-id.txx deleted file mode 100644 index bc7a2e3..0000000 --- a/libcutl/cutl/compiler/type-id.txx +++ /dev/null @@ -1,17 +0,0 @@ -// file : cutl/compiler/type-id.txx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - template <typename X> - inline - type_id:: - type_id (X const volatile& x) - : ti_ (&typeid (x)) - { - } - } -} diff --git a/libcutl/cutl/compiler/type-info.cxx b/libcutl/cutl/compiler/type-info.cxx deleted file mode 100644 index b4353b3..0000000 --- a/libcutl/cutl/compiler/type-info.cxx +++ /dev/null @@ -1,30 +0,0 @@ -// file : cutl/compiler/type-info.cxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include <cutl/compiler/type-info.hxx> - -namespace cutl -{ - namespace compiler - { - using namespace bits; - - type_info const& - lookup (type_id const& tid) - { - type_info_map::const_iterator i (type_info_map_->find (tid)); - - if (i == type_info_map_->end ()) - throw no_type_info (); - - return i->second; - } - - void - insert (type_info const& ti) - { - type_info_map_->insert (type_info_map::value_type (ti.type_id (), ti)); - } - } -} diff --git a/libcutl/cutl/compiler/type-info.hxx b/libcutl/cutl/compiler/type-info.hxx deleted file mode 100644 index 8d9a32b..0000000 --- a/libcutl/cutl/compiler/type-info.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// file : cutl/compiler/type-info.hxx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef CUTL_COMPILER_TYPE_INFO_HXX -#define CUTL_COMPILER_TYPE_INFO_HXX - -#include <map> -#include <vector> -#include <typeinfo> // std::type_info - -#include <cutl/exception.hxx> -#include <cutl/static-ptr.hxx> -#include <cutl/compiler/type-id.hxx> - -#include <cutl/details/export.hxx> - -namespace cutl -{ - namespace compiler - { - // - // - class type_info; - typedef type_info type_info_t; - - - // - // - class LIBCUTL_EXPORT base_info - { - public: - base_info (type_id const&); - - public: - type_info_t const& - type_info () const; - - private: - type_id type_id_; - mutable type_info_t const* type_info_; - }; - - typedef base_info base_info_t; - - - // - // - class LIBCUTL_EXPORT type_info - { - typedef std::vector<base_info> bases; - - public: - typedef - bases::const_iterator - base_iterator; - - public: - type_info (type_id_t const&); - - type_id_t - type_id () const; - - base_iterator - begin_base () const; - - base_iterator - end_base () const; - - void - add_base (type_id_t const&); - - private: - type_id_t type_id_; - bases bases_; - }; - - - // - // - class LIBCUTL_EXPORT no_type_info: exception {}; - - LIBCUTL_EXPORT type_info const& - lookup (type_id const&); - - LIBCUTL_EXPORT type_info const& - lookup (std::type_info const&); - - template <typename X> - type_info const& - lookup (X const volatile&); - - template<typename X> - type_info const& - lookup (); - - LIBCUTL_EXPORT void - insert (type_info const&); - - namespace bits - { - struct default_type_info_id {}; - typedef std::map<type_id, type_info> type_info_map; - static static_ptr<type_info_map, default_type_info_id> type_info_map_; - } - } -} - -#include <cutl/compiler/type-info.ixx> - -#endif // CUTL_COMPILER_TYPE_INFO_HXX diff --git a/libcutl/cutl/compiler/type-info.ixx b/libcutl/cutl/compiler/type-info.ixx deleted file mode 100644 index bf0987c..0000000 --- a/libcutl/cutl/compiler/type-info.ixx +++ /dev/null @@ -1,95 +0,0 @@ -// file : cutl/compiler/type-info.ixx -// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -namespace cutl -{ - namespace compiler - { - // base_info - // - - inline - base_info:: - base_info (type_id const& type_id) - : type_id_ (type_id), type_info_ (0) - { - } - - inline - type_info_t const& base_info:: - type_info () const - { - // We need to do delayed lookup because of the unpredictable - // order in which type information may be added. - // - // @@ MT-unsafe - // - if (type_info_ == 0) - type_info_ = &(lookup (type_id_)); - - return *type_info_; - } - - // type_info - // - - inline - type_info:: - type_info (type_id_t const& tid) - : type_id_ (tid) - { - } - - inline - type_id_t type_info:: - type_id () const - { - return type_id_; - } - - inline - type_info::base_iterator type_info:: - begin_base () const - { - return bases_.begin (); - } - - - inline - type_info::base_iterator type_info:: - end_base () const - { - return bases_.end (); - } - - inline - void type_info:: - add_base (type_id_t const& tid) - { - bases_.push_back (base_info (tid)); - } - - // - // - inline type_info const& - lookup (std::type_info const& tid) - { - return lookup (type_id (tid)); - } - - template <typename X> - inline type_info const& - lookup (X const volatile& x) - { - return lookup (typeid (x)); - } - - template<typename X> - inline type_info const& - lookup () - { - return lookup (typeid (X)); - } - } -} |