Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/RNGSSEGrammar.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief RNGSSE-related grammar
9 : : \details This file defines RNGSSE2 library related grammar, (re-)used by
10 : : several executables.
11 : : */
12 : : // *****************************************************************************
13 : : #ifndef RNGSSEGrammar_h
14 : : #define RNGSSEGrammar_h
15 : :
16 : : #include <brigand/algorithms/for_each.hpp>
17 : :
18 : : #include "CommonGrammar.hpp"
19 : :
20 : : namespace tk {
21 : : namespace grm {
22 : :
23 : : // Note that PEGTL action specializations must be in the same namespace as the
24 : : // template being specialized. See http://stackoverflow.com/a/3052604.
25 : :
26 : : // RNGSSE PEGTL actions
27 : :
28 : : //! Rule used to trigger action
29 : : template< template < class > class use, class Option,
30 : : typename field, typename sel, typename vec, typename tag,
31 : : typename... tags > struct insert_seq : pegtl::success {};
32 : : //! \brief Convert and insert RNGSSE sequence option value to map at position
33 : : //! given by tags
34 : : template< template < class > class use, class Option,
35 : : typename field, typename sel, typename vec, typename tag,
36 : : typename... tags >
37 : : struct action< insert_seq< use, Option, field, sel, vec, tag, tags... > > {
38 : : template< typename Input, typename Stack >
39 : 1 : static void apply( const Input& in, Stack& stack ) {
40 [ + - ]: 2 : ctr::RNGSSESeqLen opt;
41 : : using EnumType = ctr::RNGSSESeqLen::EnumType;
42 : : // get recently inserted key from <sel,vec>
43 : 1 : const auto& key = stack.template get< sel, vec >().back();
44 : : // Error out if RNG does not support option specified
45 [ + - ][ + - ]: 1 : if ( !ctr::RNG().supportsOpt( key, opt.value(in.string()) ) )
[ + - ][ + - ]
[ - + ]
46 [ - - ]: 0 : Message< Stack, ERROR, MsgKey::UNSUPPORTED >( stack, in );
47 : : stack.template
48 : : insert_field< field, EnumType, tag, tags... >
49 [ + - ][ + - ]: 1 : ( key, opt.value(in.string()) );
[ + - ]
50 : : // trigger error at compile-time if any of the expected option values
51 : : // is not in the keywords pool of the grammar
52 [ + - ]: 1 : brigand::for_each< typename Option::keywords >( is_keyword< use >() );
53 : 1 : }
54 : : };
55 : :
56 : : } // ::grm
57 : :
58 : : //! Toolkit, grammar definition for the RNGSSE library
59 : : namespace rngsse {
60 : :
61 : : using namespace tao;
62 : :
63 : : // RNGSSE PEGTL grammar
64 : :
65 : : //! \brief rng: match any one of the RNGSSE random number generators
66 : : template< template< class > class use >
67 : : struct rng :
68 : : pegtl::sor< typename use< kw::rngsse_gm19 >::pegtl_string,
69 : : typename use< kw::rngsse_gm29 >::pegtl_string,
70 : : typename use< kw::rngsse_gm31 >::pegtl_string,
71 : : typename use< kw::rngsse_gm55 >::pegtl_string,
72 : : typename use< kw::rngsse_gm61 >::pegtl_string,
73 : : typename use< kw::rngsse_gq581 >::pegtl_string,
74 : : typename use< kw::rngsse_gq583 >::pegtl_string,
75 : : typename use< kw::rngsse_gq584 >::pegtl_string,
76 : : typename use< kw::rngsse_mt19937 >::pegtl_string,
77 : : typename use< kw::rngsse_lfsr113 >::pegtl_string,
78 : : typename use< kw::rngsse_mrg32k3a >::pegtl_string > {};
79 : :
80 : : //! \brief Match and set RNGSSE RNG seed
81 : : template< template< class > class use, typename sel,
82 : : typename vec, typename... tags >
83 : : struct seed :
84 : : tk::grm::process< use< kw::seed >,
85 : : tk::grm::insert_seed< sel, vec, tags... > > {};
86 : :
87 : : //! \brief Match and set RNG sequence length parameter
88 : : template< template < class > class use, typename keyword,
89 : : typename option, typename field, typename sel, typename vec,
90 : : typename... tags >
91 : : struct rngsse_seq :
92 : : grm::process<
93 : : keyword,
94 : : tk::grm::insert_seq< use, option, field, sel, vec, tags... >,
95 : : pegtl::alpha > {};
96 : :
97 : : //! \brief Match and set RNGSSE sequence length
98 : : template< template< class > class use, typename sel,
99 : : typename vec, typename... tags >
100 : : struct seqlen :
101 : : rngsse_seq< use,
102 : : use< kw::seqlen >,
103 : : ctr::RNG,
104 : : tag::seqlen,
105 : : sel, vec, tags... > {};
106 : :
107 : : //! \brief Match RNGSSE RNGs in an rngs ... end block
108 : : //! \see walker::deck::rngs
109 : : template< template< class > class use, typename sel,
110 : : typename vec, typename... tags >
111 : : struct rngs :
112 : : pegtl::if_must<
113 : : tk::grm::scan< rng< use >,
114 : : tk::grm::store_back_option< use,
115 : : ctr::RNG,
116 : : sel, vec > >,
117 : : tk::grm::block< use< kw::end >,
118 : : seed< use, sel, vec, tags... >,
119 : : seqlen< use, sel, vec, tags... > > > {};
120 : :
121 : : } // rngsse::
122 : : } // tk::
123 : :
124 : : #endif // RNGSSEGrammar_h
|