// This code was generated by CLI, a command line interface
// compiler for C++.
//

#ifndef CXX_TREE_OPTIONS_HXX
#define CXX_TREE_OPTIONS_HXX

// Begin prologue.
//
//
// End prologue.

#include <cstddef>

#include <types.hxx>

#include <cxx/options.hxx>

namespace CXX
{
  namespace Tree
  {
    class options: public ::CXX::options
    {
      public:
      options (int& argc,
               char** argv,
               bool erase = false,
               ::cli::unknown_mode option = ::cli::unknown_mode::fail,
               ::cli::unknown_mode argument = ::cli::unknown_mode::stop);

      options (int start,
               int& argc,
               char** argv,
               bool erase = false,
               ::cli::unknown_mode option = ::cli::unknown_mode::fail,
               ::cli::unknown_mode argument = ::cli::unknown_mode::stop);

      options (int& argc,
               char** argv,
               int& end,
               bool erase = false,
               ::cli::unknown_mode option = ::cli::unknown_mode::fail,
               ::cli::unknown_mode argument = ::cli::unknown_mode::stop);

      options (int start,
               int& argc,
               char** argv,
               int& end,
               bool erase = false,
               ::cli::unknown_mode option = ::cli::unknown_mode::fail,
               ::cli::unknown_mode argument = ::cli::unknown_mode::stop);

      options (::cli::scanner&,
               ::cli::unknown_mode option = ::cli::unknown_mode::fail,
               ::cli::unknown_mode argument = ::cli::unknown_mode::stop);

      options ();

      // Option accessors.
      //
      const bool&
      generate_polymorphic () const;

      const NarrowStrings&
      polymorphic_type () const;

      bool
      polymorphic_type_specified () const;

      const bool&
      polymorphic_type_all () const;

      const unsigned long&
      polymorphic_plate () const;

      bool
      polymorphic_plate_specified () const;

      const NarrowStrings&
      ordered_type () const;

      bool
      ordered_type_specified () const;

      const bool&
      ordered_type_derived () const;

      const bool&
      ordered_type_mixed () const;

      const bool&
      ordered_type_all () const;

      const NarrowString&
      order_container () const;

      bool
      order_container_specified () const;

      const bool&
      generate_serialization () const;

      const bool&
      generate_ostream () const;

      const bool&
      generate_doxygen () const;

      const bool&
      generate_comparison () const;

      const bool&
      generate_default_ctor () const;

      const bool&
      generate_from_base_ctor () const;

      const bool&
      suppress_assignment () const;

      const bool&
      generate_detach () const;

      const bool&
      generate_wildcard () const;

      const bool&
      generate_any_type () const;

      const NarrowStrings&
      generate_insertion () const;

      bool
      generate_insertion_specified () const;

      const NarrowStrings&
      generate_extraction () const;

      bool
      generate_extraction_specified () const;

      const bool&
      generate_forward () const;

      const bool&
      suppress_parsing () const;

      const bool&
      generate_element_type () const;

      const bool&
      generate_element_map () const;

      const bool&
      generate_intellisense () const;

      const bool&
      omit_default_attributes () const;

      const NarrowString&
      type_naming () const;

      bool
      type_naming_specified () const;

      const NarrowString&
      function_naming () const;

      bool
      function_naming_specified () const;

      const NarrowStrings&
      type_regex () const;

      bool
      type_regex_specified () const;

      const NarrowStrings&
      accessor_regex () const;

      bool
      accessor_regex_specified () const;

      const NarrowStrings&
      one_accessor_regex () const;

      bool
      one_accessor_regex_specified () const;

      const NarrowStrings&
      opt_accessor_regex () const;

      bool
      opt_accessor_regex_specified () const;

      const NarrowStrings&
      seq_accessor_regex () const;

      bool
      seq_accessor_regex_specified () const;

      const NarrowStrings&
      modifier_regex () const;

      bool
      modifier_regex_specified () const;

      const NarrowStrings&
      one_modifier_regex () const;

      bool
      one_modifier_regex_specified () const;

      const NarrowStrings&
      opt_modifier_regex () const;

      bool
      opt_modifier_regex_specified () const;

      const NarrowStrings&
      seq_modifier_regex () const;

      bool
      seq_modifier_regex_specified () const;

      const NarrowStrings&
      parser_regex () const;

      bool
      parser_regex_specified () const;

      const NarrowStrings&
      serializer_regex () const;

      bool
      serializer_regex_specified () const;

      const NarrowStrings&
      const_regex () const;

      bool
      const_regex_specified () const;

      const NarrowStrings&
      enumerator_regex () const;

      bool
      enumerator_regex_specified () const;

      const NarrowStrings&
      element_type_regex () const;

      bool
      element_type_regex_specified () const;

      const bool&
      name_regex_trace () const;

      const bool&
      root_element_first () const;

      const bool&
      root_element_last () const;

      const bool&
      root_element_all () const;

      const bool&
      root_element_none () const;

      const NarrowStrings&
      root_element () const;

      bool
      root_element_specified () const;

      const NarrowStrings&
      custom_type () const;

      bool
      custom_type_specified () const;

      const NarrowStrings&
      custom_type_regex () const;

      bool
      custom_type_regex_specified () const;

      const std::size_t&
      parts () const;

      bool
      parts_specified () const;

      const NarrowString&
      parts_suffix () const;

      bool
      parts_suffix_specified () const;

      // Print usage information.
      //
      static void
      print_usage (::std::wostream&);

      // Implementation details.
      //
      protected:
      bool
      _parse (const char*, ::cli::scanner&);

      private:
      void
      _parse (::cli::scanner&,
              ::cli::unknown_mode option,
              ::cli::unknown_mode argument);

      public:
      bool generate_polymorphic_;
      NarrowStrings polymorphic_type_;
      bool polymorphic_type_specified_;
      bool polymorphic_type_all_;
      unsigned long polymorphic_plate_;
      bool polymorphic_plate_specified_;
      NarrowStrings ordered_type_;
      bool ordered_type_specified_;
      bool ordered_type_derived_;
      bool ordered_type_mixed_;
      bool ordered_type_all_;
      NarrowString order_container_;
      bool order_container_specified_;
      bool generate_serialization_;
      bool generate_ostream_;
      bool generate_doxygen_;
      bool generate_comparison_;
      bool generate_default_ctor_;
      bool generate_from_base_ctor_;
      bool suppress_assignment_;
      bool generate_detach_;
      bool generate_wildcard_;
      bool generate_any_type_;
      NarrowStrings generate_insertion_;
      bool generate_insertion_specified_;
      NarrowStrings generate_extraction_;
      bool generate_extraction_specified_;
      bool generate_forward_;
      bool suppress_parsing_;
      bool generate_element_type_;
      bool generate_element_map_;
      bool generate_intellisense_;
      bool omit_default_attributes_;
      NarrowString type_naming_;
      bool type_naming_specified_;
      NarrowString function_naming_;
      bool function_naming_specified_;
      NarrowStrings type_regex_;
      bool type_regex_specified_;
      NarrowStrings accessor_regex_;
      bool accessor_regex_specified_;
      NarrowStrings one_accessor_regex_;
      bool one_accessor_regex_specified_;
      NarrowStrings opt_accessor_regex_;
      bool opt_accessor_regex_specified_;
      NarrowStrings seq_accessor_regex_;
      bool seq_accessor_regex_specified_;
      NarrowStrings modifier_regex_;
      bool modifier_regex_specified_;
      NarrowStrings one_modifier_regex_;
      bool one_modifier_regex_specified_;
      NarrowStrings opt_modifier_regex_;
      bool opt_modifier_regex_specified_;
      NarrowStrings seq_modifier_regex_;
      bool seq_modifier_regex_specified_;
      NarrowStrings parser_regex_;
      bool parser_regex_specified_;
      NarrowStrings serializer_regex_;
      bool serializer_regex_specified_;
      NarrowStrings const_regex_;
      bool const_regex_specified_;
      NarrowStrings enumerator_regex_;
      bool enumerator_regex_specified_;
      NarrowStrings element_type_regex_;
      bool element_type_regex_specified_;
      bool name_regex_trace_;
      bool root_element_first_;
      bool root_element_last_;
      bool root_element_all_;
      bool root_element_none_;
      NarrowStrings root_element_;
      bool root_element_specified_;
      NarrowStrings custom_type_;
      bool custom_type_specified_;
      NarrowStrings custom_type_regex_;
      bool custom_type_regex_specified_;
      std::size_t parts_;
      bool parts_specified_;
      NarrowString parts_suffix_;
      bool parts_suffix_specified_;
    };
  }
}

#include <cxx/tree/options.ixx>

// Begin epilogue.
//
//
// End epilogue.

#endif // CXX_TREE_OPTIONS_HXX
