LCOV - code coverage report
Current view: top level - advgetopt - flags.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 6 6 100.0 %
Date: 2021-09-08 17:05:25 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2006-2021  Made to Order Software Corp.  All Rights Reserved
       2             : //
       3             : // https://snapwebsites.org/project/advgetopt
       4             : // contact@m2osw.com
       5             : //
       6             : // This program is free software; you can redistribute it and/or modify
       7             : // it under the terms of the GNU General Public License as published by
       8             : // the Free Software Foundation; either version 2 of the License, or
       9             : // (at your option) any later version.
      10             : //
      11             : // This program is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : //
      16             : // You should have received a copy of the GNU General Public License along
      17             : // with this program; if not, write to the Free Software Foundation, Inc.,
      18             : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      19             : #pragma once
      20             : 
      21             : /** \file
      22             :  * \brief Definitions of the options class a initialization functions.
      23             :  *
      24             :  * The advgetopt library offers an advanced way to manage your command
      25             :  * line tools options on the command line, in environment variables, and
      26             :  * in configuration files.
      27             :  */
      28             : 
      29             : 
      30             : // C++ lib
      31             : //
      32             : #include    <cstdint>
      33             : 
      34             : 
      35             : 
      36             : namespace advgetopt
      37             : {
      38             : 
      39             : 
      40             : 
      41             : typedef std::uint32_t       flag_t;
      42             : 
      43             : static constexpr flag_t     GETOPT_FLAG_NONE                  = static_cast<flag_t>(0x00000000);
      44             : 
      45             : static constexpr flag_t     GETOPT_FLAG_COMMAND_LINE          = static_cast<flag_t>(0x00000001);  // acceptable on the command line
      46             : static constexpr flag_t     GETOPT_FLAG_ENVIRONMENT_VARIABLE  = static_cast<flag_t>(0x00000002);  // acceptable in environment variable
      47             : static constexpr flag_t     GETOPT_FLAG_CONFIGURATION_FILE    = static_cast<flag_t>(0x00000004);  // acceptable in configuration files
      48             : static constexpr flag_t     GETOPT_FLAG_DYNAMIC_CONFIGURATION = static_cast<flag_t>(0x00000008);  // acceptable from the dynamic configuration system (see fluid-settings)
      49             : 
      50             : static constexpr flag_t     GETOPT_FLAG_ALIAS                 = static_cast<flag_t>(0x00000010);  // alias, result in another option defined in "help" string
      51             : static constexpr flag_t     GETOPT_FLAG_FLAG                  = static_cast<flag_t>(0x00000020);  // no parameter allowed (--help)
      52             : static constexpr flag_t     GETOPT_FLAG_REQUIRED              = static_cast<flag_t>(0x00000040);  // required (--host 127.0.0.1)
      53             : static constexpr flag_t     GETOPT_FLAG_MULTIPLE              = static_cast<flag_t>(0x00000080);  // any number of parameter is allowed (--files a b c d ...)
      54             : static constexpr flag_t     GETOPT_FLAG_DEFAULT_OPTION        = static_cast<flag_t>(0x00000100);  // where entries go by default (a.k.a. after "--")
      55             : static constexpr flag_t     GETOPT_FLAG_HAS_DEFAULT           = static_cast<flag_t>(0x00000200);  // default value is defined
      56             : 
      57             : static constexpr flag_t     GETOPT_FLAG_SHOW_MOST             = static_cast<flag_t>(0x00000000);  // show in usage() when not in GROUP1 or GROUP2
      58             : static constexpr flag_t     GETOPT_FLAG_SHOW_USAGE_ON_ERROR   = static_cast<flag_t>(0x00001000);  // show in usage() when an error occurs
      59             : static constexpr flag_t     GETOPT_FLAG_SHOW_ALL              = static_cast<flag_t>(0x00002000);  // show in usage() when --long-help is used
      60             : static constexpr flag_t     GETOPT_FLAG_SHOW_GROUP1           = static_cast<flag_t>(0x00004000);  // show in usage() when --<group1>-help is used (app dependent)
      61             : static constexpr flag_t     GETOPT_FLAG_SHOW_GROUP2           = static_cast<flag_t>(0x00008000);  // show in usage() when --<group2>-help is used (app dependent)
      62             : 
      63             : static constexpr flag_t     GETOPT_FLAG_GROUP_MASK            = static_cast<flag_t>(0x00700000);
      64             : static constexpr flag_t     GETOPT_FLAG_GROUP_MINIMUM         = static_cast<flag_t>(0);
      65             : static constexpr flag_t     GETOPT_FLAG_GROUP_MAXIMUM         = static_cast<flag_t>(7);
      66             : static constexpr flag_t     GETOPT_FLAG_GROUP_SHIFT           = static_cast<flag_t>(20);
      67             : static constexpr flag_t     GETOPT_FLAG_GROUP_NONE            = static_cast<flag_t>(0x00000000);  // not in a group
      68             : static constexpr flag_t     GETOPT_FLAG_GROUP_COMMANDS        = static_cast<flag_t>(0x00100000);  // in command group (group 1)
      69             : static constexpr flag_t     GETOPT_FLAG_GROUP_OPTIONS         = static_cast<flag_t>(0x00200000);  // in option group (group 2)
      70             : static constexpr flag_t     GETOPT_FLAG_GROUP_THREE           = static_cast<flag_t>(0x00300000);  // in group 3
      71             : static constexpr flag_t     GETOPT_FLAG_GROUP_FOUR            = static_cast<flag_t>(0x00400000);  // in group 4
      72             : static constexpr flag_t     GETOPT_FLAG_GROUP_FIVE            = static_cast<flag_t>(0x00500000);  // in group 5
      73             : static constexpr flag_t     GETOPT_FLAG_GROUP_SIX             = static_cast<flag_t>(0x00600000);  // in group 6
      74             : static constexpr flag_t     GETOPT_FLAG_GROUP_SEVEN           = static_cast<flag_t>(0x00700000);  // in group 7
      75             : 
      76             : static constexpr flag_t     GETOPT_FLAG_DYNAMIC               = static_cast<flag_t>(0x20000000);  // this value was found in a configuration file and dynamic parameters are allowed (i.e. no definition for this option was found)
      77             : static constexpr flag_t     GETOPT_FLAG_LOCK                  = static_cast<flag_t>(0x40000000);  // this value is currently locked (can't be modified)
      78             : 
      79             : static constexpr flag_t     GETOPT_FLAG_END                   = static_cast<flag_t>(0x80000000);  // mark the end of the list
      80             : 
      81             : 
      82             : 
      83             : template<class none = void>
      84             : constexpr flag_t option_flags_merge()
      85             : {
      86             :     return GETOPT_FLAG_NONE;
      87             : }
      88             : 
      89             : 
      90             : template<flag_t flag, flag_t ...args>
      91             : constexpr flag_t option_flags_merge()
      92             : {
      93             :     static_assert((flag & GETOPT_FLAG_GROUP_MASK) == 0
      94             :                || (option_flags_merge<args...>() & GETOPT_FLAG_GROUP_MASK) == 0
      95             :                , "more than one GETOPT_FLAG_GROUP_... is not allowed within one set of flags.");
      96             : 
      97             :     return flag | option_flags_merge<args...>();
      98             : }
      99             : 
     100             : 
     101             : template<flag_t flag, flag_t ...args>
     102             : constexpr flag_t combine_option_flags()
     103             : {
     104             :     constexpr flag_t result(option_flags_merge<flag, args...>());
     105             : 
     106             :     static_assert(static_cast<int>((result & GETOPT_FLAG_FLAG) != 0)
     107             :                 + static_cast<int>((result & (GETOPT_FLAG_REQUIRED | GETOPT_FLAG_MULTIPLE | GETOPT_FLAG_DEFAULT_OPTION)) != 0)
     108             :                 + static_cast<int>((result & GETOPT_FLAG_END) != 0)
     109             :                         <= 1
     110             :                 , "flag GETOPT_FLAG_FLAG is not compatible with any of GETOPT_FLAG_REQUIRED | GETOPT_FLAG_MULTIPLE | GETOPT_FLAG_DEFAULT_OPTION or none of these flags were specified.");
     111             : 
     112             :     static_assert(((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) != 0)
     113             :                 ^ ((result & GETOPT_FLAG_END) != 0)
     114             :                 , "flags must include at least one of GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE or be set to GETOPT_FLAG_END");
     115             : 
     116             :     return result;
     117             : }
     118             : 
     119             : 
     120             : constexpr flag_t end_flags()
     121             : {
     122             :     return combine_option_flags<GETOPT_FLAG_END>();
     123             : }
     124             : 
     125             : 
     126             : template<flag_t ...args>
     127             : constexpr flag_t any_flags()
     128             : {
     129             :     constexpr flag_t result(combine_option_flags<args...>());
     130             : 
     131             :     static_assert((result & GETOPT_FLAG_END) == 0
     132             :                 , "an option_flag() cannot include GETOPT_FLAG_END");
     133             : 
     134             :     return result;
     135             : }
     136             : 
     137             : 
     138             : template<flag_t ...args>
     139             : constexpr flag_t option_flags()
     140             : {
     141             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_FLAG, args...>());
     142             : 
     143             :     //static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     144             :     //            , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     145             : 
     146             :     return result;
     147             : }
     148             : 
     149             : 
     150             : template<flag_t ...args>
     151           6 : constexpr flag_t all_flags()
     152             : {
     153           6 :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE
     154             :                                                , GETOPT_FLAG_ENVIRONMENT_VARIABLE
     155             :                                                , GETOPT_FLAG_CONFIGURATION_FILE
     156             :                                                , args...>());
     157             : 
     158           6 :     return result;
     159             : }
     160             : 
     161             : 
     162             : template<flag_t ...args>
     163             : constexpr flag_t standalone_all_flags()
     164             : {
     165             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE
     166             :                                                , GETOPT_FLAG_ENVIRONMENT_VARIABLE
     167             :                                                , GETOPT_FLAG_CONFIGURATION_FILE
     168             :                                                , GETOPT_FLAG_FLAG
     169             :                                                , args...>());
     170             : 
     171             :     return result;
     172             : }
     173             : 
     174             : 
     175             : template<flag_t ...args>
     176             : constexpr flag_t standalone_command_flags()
     177             : {
     178             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, GETOPT_FLAG_FLAG, args...>());
     179             : 
     180             :     static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     181             :                 , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     182             : 
     183             :     return result;
     184             : }
     185             : 
     186             : 
     187             : template<flag_t ...args>
     188          17 : constexpr flag_t command_flags()
     189             : {
     190          17 :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, args...>());
     191             : 
     192             :     static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     193             :                 , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     194             : 
     195          17 :     return result;
     196             : }
     197             : 
     198             : 
     199             : template<flag_t ...args>
     200             : constexpr flag_t var_flags()
     201             : {
     202             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_ENVIRONMENT_VARIABLE, args...>());
     203             : 
     204             :     static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     205             :                 , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE");
     206             : 
     207             :     return result;
     208             : }
     209             : 
     210             : 
     211             : template<flag_t ...args>
     212             : constexpr flag_t config_flags()
     213             : {
     214             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_CONFIGURATION_FILE, GETOPT_FLAG_REQUIRED, args...>());
     215             : 
     216             :     static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE)) == 0
     217             :                 , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE");
     218             : 
     219             :     return result;
     220             : }
     221             : 
     222             : 
     223             : 
     224             : 
     225             : 
     226             : 
     227             : }   // namespace advgetopt
     228             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.13