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: 2024-10-05 13:34:54 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2006-2024  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++
      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             : static constexpr flag_t     GETOPT_FLAG_PROCESS_VARIABLES     = static_cast<flag_t>(0x00000400);  // variables within this parameter will automatically be processed
      57             : static constexpr flag_t     GETOPT_FLAG_ARRAY                 = static_cast<flag_t>(0x00000800);  // allow for options to include an array or map specification (--opt[3] or --opt:back)
      58             : 
      59             : static constexpr flag_t     GETOPT_FLAG_SHOW_MOST             = static_cast<flag_t>(0x00000000);  // show in usage() when not in GROUP1 or GROUP2
      60             : static constexpr flag_t     GETOPT_FLAG_SHOW_USAGE_ON_ERROR   = static_cast<flag_t>(0x00001000);  // show in usage() when an error occurs
      61             : static constexpr flag_t     GETOPT_FLAG_SHOW_ALL              = static_cast<flag_t>(0x00002000);  // show in usage() when --long-help is used
      62             : static constexpr flag_t     GETOPT_FLAG_SHOW_GROUP1           = static_cast<flag_t>(0x00004000);  // show in usage() when --<group1>-help is used (app dependent)
      63             : static constexpr flag_t     GETOPT_FLAG_SHOW_GROUP2           = static_cast<flag_t>(0x00008000);  // show in usage() when --<group2>-help is used (app dependent)
      64             : static constexpr flag_t     GETOPT_FLAG_SHOW_SYSTEM           = static_cast<flag_t>(0x00010000);  // show in usage() when --system-help is used (options added by advgetopt, snaplogger, communicatord, etc.)
      65             : 
      66             : static constexpr flag_t     GETOPT_FLAG_GROUP_MASK            = static_cast<flag_t>(0x00700000);
      67             : static constexpr flag_t     GETOPT_FLAG_GROUP_MINIMUM         = static_cast<flag_t>(0);
      68             : static constexpr flag_t     GETOPT_FLAG_GROUP_MAXIMUM         = static_cast<flag_t>(7);
      69             : static constexpr flag_t     GETOPT_FLAG_GROUP_SHIFT           = static_cast<flag_t>(20);
      70             : static constexpr flag_t     GETOPT_FLAG_GROUP_NONE            = static_cast<flag_t>(0x00000000);  // not in a group
      71             : static constexpr flag_t     GETOPT_FLAG_GROUP_COMMANDS        = static_cast<flag_t>(0x00100000);  // in command group (group 1)
      72             : static constexpr flag_t     GETOPT_FLAG_GROUP_OPTIONS         = static_cast<flag_t>(0x00200000);  // in option group (group 2)
      73             : static constexpr flag_t     GETOPT_FLAG_GROUP_THREE           = static_cast<flag_t>(0x00300000);  // in group 3
      74             : static constexpr flag_t     GETOPT_FLAG_GROUP_FOUR            = static_cast<flag_t>(0x00400000);  // in group 4
      75             : static constexpr flag_t     GETOPT_FLAG_GROUP_FIVE            = static_cast<flag_t>(0x00500000);  // in group 5
      76             : static constexpr flag_t     GETOPT_FLAG_GROUP_SIX             = static_cast<flag_t>(0x00600000);  // in group 6
      77             : static constexpr flag_t     GETOPT_FLAG_GROUP_SEVEN           = static_cast<flag_t>(0x00700000);  // in group 7
      78             : 
      79             : 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)
      80             : static constexpr flag_t     GETOPT_FLAG_LOCK                  = static_cast<flag_t>(0x40000000);  // this value is currently locked (can't be modified)
      81             : 
      82             : static constexpr flag_t     GETOPT_FLAG_END                   = static_cast<flag_t>(0x80000000);  // mark the end of the list
      83             : 
      84             : 
      85             : 
      86             : template<class none = void>
      87             : constexpr flag_t option_flags_merge()
      88             : {
      89             :     return GETOPT_FLAG_NONE;
      90             : }
      91             : 
      92             : 
      93             : template<flag_t flag, flag_t ...args>
      94             : constexpr flag_t option_flags_merge()
      95             : {
      96             :     static_assert((flag & GETOPT_FLAG_GROUP_MASK) == 0
      97             :                || (option_flags_merge<args...>() & GETOPT_FLAG_GROUP_MASK) == 0
      98             :                , "more than one GETOPT_FLAG_GROUP_... is not allowed within one set of flags.");
      99             : 
     100             :     return flag | option_flags_merge<args...>();
     101             : }
     102             : 
     103             : 
     104             : template<flag_t flag, flag_t ...args>
     105             : constexpr flag_t combine_option_flags()
     106             : {
     107             :     constexpr flag_t result(option_flags_merge<flag, args...>());
     108             : 
     109             :     static_assert(static_cast<int>((result & GETOPT_FLAG_FLAG) != 0)
     110             :                 + static_cast<int>((result & (GETOPT_FLAG_REQUIRED | GETOPT_FLAG_MULTIPLE | GETOPT_FLAG_DEFAULT_OPTION)) != 0)
     111             :                 + static_cast<int>((result & GETOPT_FLAG_END) != 0)
     112             :                         <= 1
     113             :                 , "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.");
     114             : 
     115             :     static_assert(((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) != 0)
     116             :                 ^ ((result & GETOPT_FLAG_END) != 0)
     117             :                 , "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");
     118             : 
     119             :     return result;
     120             : }
     121             : 
     122             : 
     123             : constexpr flag_t end_flags()
     124             : {
     125             :     return combine_option_flags<GETOPT_FLAG_END>();
     126             : }
     127             : 
     128             : 
     129             : template<flag_t ...args>
     130             : constexpr flag_t any_flags()
     131             : {
     132             :     constexpr flag_t result(combine_option_flags<args...>());
     133             : 
     134             :     static_assert((result & GETOPT_FLAG_END) == 0
     135             :                 , "an option_flag() cannot include GETOPT_FLAG_END");
     136             : 
     137             :     return result;
     138             : }
     139             : 
     140             : 
     141             : template<flag_t ...args>
     142             : constexpr flag_t option_flags()
     143             : {
     144             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_FLAG, args...>());
     145             : 
     146             :     //static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     147             :     //            , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     148             : 
     149             :     return result;
     150             : }
     151             : 
     152             : 
     153             : template<flag_t ...args>
     154           6 : constexpr flag_t all_flags()
     155             : {
     156           6 :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE
     157             :                                                , GETOPT_FLAG_ENVIRONMENT_VARIABLE
     158             :                                                , GETOPT_FLAG_CONFIGURATION_FILE
     159             :                                                , args...>());
     160             : 
     161           6 :     return result;
     162             : }
     163             : 
     164             : 
     165             : template<flag_t ...args>
     166             : constexpr flag_t standalone_all_flags()
     167             : {
     168             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE
     169             :                                                , GETOPT_FLAG_ENVIRONMENT_VARIABLE
     170             :                                                , GETOPT_FLAG_CONFIGURATION_FILE
     171             :                                                , GETOPT_FLAG_FLAG
     172             :                                                , args...>());
     173             : 
     174             :     return result;
     175             : }
     176             : 
     177             : 
     178             : template<flag_t ...args>
     179             : constexpr flag_t standalone_command_flags()
     180             : {
     181             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, GETOPT_FLAG_FLAG, args...>());
     182             : 
     183             :     static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     184             :                 , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     185             : 
     186             :     return result;
     187             : }
     188             : 
     189             : 
     190             : template<flag_t ...args>
     191          18 : constexpr flag_t command_flags()
     192             : {
     193          18 :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, args...>());
     194             : 
     195             :     static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     196             :                 , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE");
     197             : 
     198          18 :     return result;
     199             : }
     200             : 
     201             : 
     202             : template<flag_t ...args>
     203             : constexpr flag_t var_flags()
     204             : {
     205             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_ENVIRONMENT_VARIABLE, args...>());
     206             : 
     207             :     static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0
     208             :                 , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE");
     209             : 
     210             :     return result;
     211             : }
     212             : 
     213             : 
     214             : template<flag_t ...args>
     215             : constexpr flag_t config_flags()
     216             : {
     217             :     constexpr flag_t result(combine_option_flags<GETOPT_FLAG_CONFIGURATION_FILE, GETOPT_FLAG_REQUIRED, args...>());
     218             : 
     219             :     static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE)) == 0
     220             :                 , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE");
     221             : 
     222             :     return result;
     223             : }
     224             : 
     225             : 
     226             : 
     227             : 
     228             : 
     229             : 
     230             : }   // namespace advgetopt
     231             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.14

Snap C++ | List of projects | List of versions