// file : cli/context.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file #ifndef CLI_CONTEXT_HXX #define CLI_CONTEXT_HXX #include #include #include #include #include // std::size_t #include #include "options.hxx" #include "semantics.hxx" #include "traversal.hxx" using std::endl; class generation_failed {}; class context { public: typedef std::size_t size_t; typedef std::string string; typedef ::options options_type; private: struct data; cutl::shared_ptr data_; public: std::ostream& os; semantics::cli_unit& unit; options_type const& options; bool modifier; bool specifier; bool usage; string const& inl; string const& opt_prefix; string const& opt_sep; string const& cli; typedef std::map reserved_name_map_type; reserved_name_map_type const& reserved_name_map; typedef std::set keyword_set_type; keyword_set_type const& keyword_set; private: struct data { string inl_; string cli_; keyword_set_type keyword_set_; }; public: // Escape C++ keywords, reserved names, and illegal characters. // string escape (string const&) const; // Translate and format the documentation string. Translate converts // the -style constructs to \i{arg}. Format converts the string // to the output format. // enum output_type { ot_plain, ot_html, ot_man }; static string translate_arg (string const&, std::set&); static string translate (string const&, std::set const&); static string format (string const&, output_type); public: static string const& ename (semantics::nameable& n) { return n.context ().get ("name"); } static string const& especifier (semantics::nameable& n) { return n.context ().get ("specifier"); } static string const& emember (semantics::nameable& n) { return n.context ().get ("member"); } static string const& especifier_member (semantics::nameable& n) { return n.context ().get ("specifier-member"); } public: // Return fully-qualified C++ or CLI name. // string fq_name (semantics::nameable& n, bool cxx_name = true); // Open/close cli namespace. // public: void cli_open (); void cli_close (); public: context (std::ostream&, semantics::cli_unit&, options_type const&); context (context&); private: context& operator= (context const&); }; // Checks if scope Y names any of X. // template bool has (Y& y) { for (semantics::scope::names_iterator i (y.names_begin ()), e (y.names_end ()); i != e; ++i) if (i->named (). template is_a ()) return true; return false; } // Standard namespace traverser. // struct namespace_: traversal::namespace_, context { namespace_ (context& c) : context (c) {} virtual void pre (type&); virtual void post (type&); }; #endif // CLI_CONTEXT_HXX