SeqAn3  3.2.0
The Modern C++ library for sequence analysis.
auxiliary.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <concepts>
16 #include <sstream>
17 #include <type_traits>
18 #include <unordered_map>
19 #include <vector>
20 
24 
25 namespace seqan3::custom
26 {
27 
50 template <typename t>
52 {}; // forward
53 
55 template <typename t>
56 struct argument_parsing<t const> : argument_parsing<t>
57 {};
58 
59 template <typename t>
60 struct argument_parsing<t &> : argument_parsing<t>
61 {};
62 
63 template <typename t>
64 struct argument_parsing<t const &> : argument_parsing<t>
65 {};
67 
68 } // namespace seqan3::custom
69 
70 namespace seqan3::detail::adl_only
71 {
72 
74 template <typename t>
75 std::unordered_map<std::string_view, t> enumeration_names(t) = delete;
76 
80 template <typename option_t>
81 struct enumeration_names_cpo : public detail::customisation_point_object<enumeration_names_cpo<option_t>, 1>
82 {
84  using base_t = detail::customisation_point_object<enumeration_names_cpo<option_t>, 1>;
86  using base_t::base_t;
87 
91  template <typename option_type>
92  using option_or_type_identity =
94  std::remove_cvref_t<option_type>,
95  std::type_identity<option_type>>;
96 
100  template <typename option_type = option_t>
101  static constexpr auto SEQAN3_CPO_OVERLOAD(priority_tag<1>)(
103  );
104 
114  template <typename option_type = option_t>
115  static constexpr auto SEQAN3_CPO_OVERLOAD(priority_tag<0>)(
116  /*return*/ enumeration_names(option_or_type_identity<option_type>{}) /*;*/
117  );
118 };
119 
120 } // namespace seqan3::detail::adl_only
121 
122 namespace seqan3
123 {
124 
163 template <typename option_type>
165  {
166  detail::adl_only::enumeration_names_cpo<option_type>{}()
167  };
168  }
169 inline auto const enumeration_names = detail::adl_only::enumeration_names_cpo<option_type>{}();
171 
185 template <typename option_type>
186 concept named_enumeration = requires {
187  {
188  seqan3::enumeration_names<option_type>
189  };
190  };
192 
206 template <typename option_type>
210 
225 template <typename char_t, typename option_type>
227 inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & s, option_type && op)
228 {
229  for (auto & [key, value] : enumeration_names<option_type>)
230  {
231  if (op == value)
232  return s << key;
233  }
234 
235  return s << "<UNKNOWN_VALUE>";
236 }
238 
251 enum option_spec
252 {
253  standard = 0,
254  required = 1,
259  advanced = 2,
263  hidden = 4
267 };
268 
270 enum class update_notifications
271 {
272  on,
273  off
274 };
275 
289 struct argument_parser_meta_data // holds all meta information
290 {
324  unsigned man_page_section{1};
340 };
341 
342 } // namespace seqan3
The <concepts> header from C++20's standard library.
Helper utilities for defining customisation point objects (CPOs).
#define SEQAN3_CPO_OVERLOAD(...)
A macro that helps to define a seqan3::detail::customisation_point_object.
Definition: customisation_point.hpp:107
Provides seqan3::debug_stream and related types.
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
option_spec
Used to further specify argument_parser options/flags.
Definition: auxiliary.hpp:248
@ standard
The default were no checking or special displaying is happening.
Definition: auxiliary.hpp:249
@ advanced
Definition: auxiliary.hpp:255
@ hidden
Definition: auxiliary.hpp:259
@ required
Definition: auxiliary.hpp:250
Checks whether the the type can be used in an add_(positional_)option call on the argument parser.
Concept for input streams.
Checks whether the free function seqan3::enumeration_names can be called on the type.
Stream concepts.
A namespace for third party and standard library specialisations of SeqAn customisation points.
Definition: char.hpp:42
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
requires detail::debug_stream_range_guard< alignment_matrix_t > &&detail::matrix< alignment_matrix_t > debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &s, alignment_matrix_t &&matrix)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: debug_matrix.hpp:496
update_notifications
Indicates whether application allows automatic update notifications by the seqan3::argument_parser.
Definition: auxiliary.hpp:267
@ off
Automatic update notifications should be disabled.
@ on
Automatic update notifications should be enabled.
std::string long_copyright
Detailed copyright information that will be displayed when the user specifies "--copyright" on the co...
Definition: auxiliary.hpp:312
std::string man_page_title
The title of your man page when exported by specifying "--export-help man" on the common line.
Definition: auxiliary.hpp:318
std::string email
The author's e-mail address for correspondence.
Definition: auxiliary.hpp:300
std::string short_copyright
Brief copyright (and/or license) information.
Definition: auxiliary.hpp:308
std::string date
The date that the application was last updated. Keep this updated, ! since it will tell your users th...
Definition: auxiliary.hpp:304
std::string author
Your name ;-)
Definition: auxiliary.hpp:298
std::string version
The version information MAJOR.MINOR.PATH (e.g. 3.1.3)
Definition: auxiliary.hpp:294
std::string app_name
The application name that will be displayed on the help page.
Definition: auxiliary.hpp:292
std::vector< std::string > synopsis
Add lines of usage to the synopsis section of the help page (e.g. "./my_read_mapper [OPTIONS] FILE1 F...
Definition: auxiliary.hpp:330
std::string short_description
A short description of the application (e.g. "A tool for mapping reads to the genome").
Definition: auxiliary.hpp:296
std::string url
A link to your github/gitlab project with the newest release.
Definition: auxiliary.hpp:306
std::string citation
How users shall cite your application.
Definition: auxiliary.hpp:314
std::vector< std::string > description
A more detailed description that is displayed on the help page in the section "DESCRIPTION"....
Definition: auxiliary.hpp:326
std::vector< std::string > examples
Provide some examples on how to use your tool and what standard parameters might be appropriate in di...
Definition: auxiliary.hpp:335
unsigned man_page_section
The man page section info (type man man on the command line for more information).
Definition: auxiliary.hpp:320
A type that can be specialised to provide customisation point implementations for the seqan3::argumen...
Definition: auxiliary.hpp:52