// Copyright (C) 2006 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #ifndef DLIB_CMD_LINE_PARSER_CHECk_C_ #define DLIB_CMD_LINE_PARSER_CHECk_C_ #include "cmd_line_parser_kernel_abstract.h" #include "../algs.h" #include "../assert.h" #include <string> #include "../interfaces/cmd_line_parser_option.h" #include "../string.h" namespace dlib { template < typename clp_check > class cmd_line_parser_check_c : public clp_check { public: typedef typename clp_check::char_type char_type; typedef typename clp_check::string_type string_type; template < typename T > void check_option_arg_type ( const string_type& option_name ) const; template < typename T > void check_option_arg_range ( const string_type& option_name, const T& first, const T& last ) const; template < typename T, size_t length > void check_option_arg_range ( const string_type& option_name, const T (&arg_set)[length] ) const; template < size_t length > void check_option_arg_range ( const string_type& option_name, const char_type* (&arg_set)[length] ) const; template < size_t length > void check_incompatible_options ( const char_type* (&option_set)[length] ) const; template < size_t length > void check_one_time_options ( const char_type* (&option_set)[length] ) const; void check_incompatible_options ( const string_type& option_name1, const string_type& option_name2 ) const; void check_sub_option ( const string_type& parent_option, const string_type& sub_option ) const; template < size_t length > void check_sub_options ( const string_type& parent_option, const char_type* (&sub_option_set)[length] ) const; template < size_t length > void check_sub_options ( const char_type* (&parent_option_set)[length], const string_type& sub_option ) const; template < size_t parent_length, size_t sub_length > void check_sub_options ( const char_type* (&parent_option_set)[parent_length], const char_type* (&sub_option_set)[sub_length] ) const; }; template < typename clp_check > inline void swap ( cmd_line_parser_check_c<clp_check>& a, cmd_line_parser_check_c<clp_check>& b ) { a.swap(b); } // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- // member function definitions // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- template <typename clp_check> template <typename T> void cmd_line_parser_check_c<clp_check>:: check_option_arg_type ( const string_type& option_name ) const { COMPILE_TIME_ASSERT(is_pointer_type<T>::value == false); // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_name), "\tvoid cmd_line_parser_check::check_option_arg_type()" << "\n\tYou must have already parsed the command line and option_name must be valid." << "\n\tthis: " << this << "\n\toption_is_defined(option_name): " << ((this->option_is_defined(option_name))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_name: " << option_name ); clp_check::template check_option_arg_type<T>(option_name); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template <typename T> void cmd_line_parser_check_c<clp_check>:: check_option_arg_range ( const string_type& option_name, const T& first, const T& last ) const { COMPILE_TIME_ASSERT(is_pointer_type<T>::value == false); // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_name) && first <= last, "\tvoid cmd_line_parser_check::check_option_arg_range()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_name): " << ((this->option_is_defined(option_name))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_name: " << option_name << "\n\tfirst: " << first << "\n\tlast: " << last ); clp_check::check_option_arg_range(option_name,first,last); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < typename T, size_t length > void cmd_line_parser_check_c<clp_check>:: check_option_arg_range ( const string_type& option_name, const T (&arg_set)[length] ) const { COMPILE_TIME_ASSERT(is_pointer_type<T>::value == false); // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_name), "\tvoid cmd_line_parser_check::check_option_arg_range()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_name): " << ((this->option_is_defined(option_name))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_name: " << option_name ); clp_check::check_option_arg_range(option_name,arg_set); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t length > void cmd_line_parser_check_c<clp_check>:: check_option_arg_range ( const string_type& option_name, const char_type* (&arg_set)[length] ) const { // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_name), "\tvoid cmd_line_parser_check::check_option_arg_range()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_name): " << ((this->option_is_defined(option_name))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_name: " << option_name ); clp_check::check_option_arg_range(option_name,arg_set); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t length > void cmd_line_parser_check_c<clp_check>:: check_incompatible_options ( const char_type* (&option_set)[length] ) const { // make sure requires clause is not broken for (size_t i = 0; i < length; ++i) { DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_set[i]), "\tvoid cmd_line_parser_check::check_incompatible_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_set[i]): " << ((this->option_is_defined(option_set[i]))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_set[i]: " << option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } clp_check::check_incompatible_options(option_set); } // ---------------------------------------------------------------------------------------- template <typename clp_check> void cmd_line_parser_check_c<clp_check>:: check_incompatible_options ( const string_type& option_name1, const string_type& option_name2 ) const { // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_name1) && this->option_is_defined(option_name2), "\tvoid cmd_line_parser_check::check_incompatible_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_name1): " << ((this->option_is_defined(option_name1))?"true":"false") << "\n\toption_is_defined(option_name2): " << ((this->option_is_defined(option_name2))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_name1: " << option_name1 << "\n\toption_name2: " << option_name2 ); clp_check::check_incompatible_options(option_name1,option_name2); } // ---------------------------------------------------------------------------------------- template <typename clp_check> void cmd_line_parser_check_c<clp_check>:: check_sub_option ( const string_type& parent_option, const string_type& sub_option ) const { // make sure requires clause is not broken DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(parent_option) && this->option_is_defined(sub_option), "\tvoid cmd_line_parser_check::check_sub_option()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\tparsed_line(): " << this->parsed_line() << "\n\toption_is_defined(parent_option): " << this->option_is_defined(parent_option) << "\n\toption_is_defined(sub_option): " << this->option_is_defined(sub_option) << "\n\tparent_option: " << parent_option << "\n\tsub_option: " << sub_option ); clp_check::check_sub_option(parent_option,sub_option); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t length > void cmd_line_parser_check_c<clp_check>:: check_sub_options ( const string_type& parent_option, const char_type* (&sub_option_set)[length] ) const { // make sure requires clause is not broken for (size_t i = 0; i < length; ++i) { DLIB_CASSERT( this->option_is_defined(sub_option_set[i]), "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(sub_option_set[i]): " << ((this->option_is_defined(sub_option_set[i]))?"true":"false") << "\n\tsub_option_set[i]: " << sub_option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(parent_option), "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(parent_option): " << ((this->option_is_defined(parent_option))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\tparent_option: " << parent_option ); clp_check::check_sub_options(parent_option,sub_option_set); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t length > void cmd_line_parser_check_c<clp_check>:: check_sub_options ( const char_type* (&parent_option_set)[length], const string_type& sub_option ) const { // make sure requires clause is not broken for (size_t i = 0; i < length; ++i) { DLIB_CASSERT( this->option_is_defined(parent_option_set[i]), "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(parent_option_set[i]): " << ((this->option_is_defined(parent_option_set[i]))?"true":"false") << "\n\tparent_option_set[i]: " << parent_option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(sub_option), "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(sub_option): " << ((this->option_is_defined(sub_option))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\tsub_option: " << sub_option ); clp_check::check_sub_options(parent_option_set,sub_option); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t parent_length, size_t sub_length > void cmd_line_parser_check_c<clp_check>:: check_sub_options ( const char_type* (&parent_option_set)[parent_length], const char_type* (&sub_option_set)[sub_length] ) const { // make sure requires clause is not broken for (size_t i = 0; i < sub_length; ++i) { DLIB_CASSERT( this->option_is_defined(sub_option_set[i]), "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(sub_option_set[i]): " << ((this->option_is_defined(sub_option_set[i]))?"true":"false") << "\n\tsub_option_set[i]: " << sub_option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } for (size_t i = 0; i < parent_length; ++i) { DLIB_CASSERT( this->option_is_defined(parent_option_set[i]), "\tvoid cmd_line_parser_check::check_parent_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(parent_option_set[i]): " << ((this->option_is_defined(parent_option_set[i]))?"true":"false") << "\n\tparent_option_set[i]: " << parent_option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } DLIB_CASSERT( this->parsed_line() == true , "\tvoid cmd_line_parser_check::check_sub_options()" << "\n\tYou must have parsed the command line before you call this function." << "\n\tthis: " << this << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") ); clp_check::check_sub_options(parent_option_set,sub_option_set); } // ---------------------------------------------------------------------------------------- template <typename clp_check> template < size_t length > void cmd_line_parser_check_c<clp_check>:: check_one_time_options ( const char_type* (&option_set)[length] ) const { // make sure requires clause is not broken for (size_t i = 0; i < length; ++i) { DLIB_CASSERT( this->parsed_line() == true && this->option_is_defined(option_set[i]), "\tvoid cmd_line_parser_check::check_one_time_options()" << "\n\tSee the requires clause for this function." << "\n\tthis: " << this << "\n\toption_is_defined(option_set[i]): " << ((this->option_is_defined(option_set[i]))?"true":"false") << "\n\tparsed_line(): " << ((this->parsed_line())?"true":"false") << "\n\toption_set[i]: " << option_set[i] << "\n\ti: " << static_cast<unsigned long>(i) ); } clp_check::check_one_time_options(option_set); } // ---------------------------------------------------------------------------------------- } #endif // DLIB_CMD_LINE_PARSER_CHECk_C_