CORSIKA  @c8_version@
The framework to simulate particle cascades for astroparticle physics
EngineTraits.hpp
1 /*
2  * (c) Copyright 2021 CORSIKA Project, corsika-project@lists.kit.edu
3  *
4  * This software is distributed under the terms of the GNU General Public
5  * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
6  * the license.
7  */
8 
9 /*
10  * EngineTraits.hpp
11  *
12  * Created on: 23 de fev. de 2021
13  * Author: Antonio Augusto Alves Junior
14  */
15 
16 #pragma once
17 
18 #include <stdint.h>
19 #include "Random123/array.h"
20 #include "Random123/philox.h"
21 #include "Random123/threefry.h"
22 #include "Random123/ars.h"
23 #include "Random123/ReinterpretCtr.hpp"
24 
25 namespace random_iterator {
26 
27  namespace detail {
28 
29  template <typename Engine>
30  struct random_traits;
31  /*
32  * random_traits<T>::state_type { counter, state}
33  * random_traits<T>::advance_type;
34  * random_traits<T>::init_type;
35  * random_traits<T>::result_type;
36  */
37 
38  // philox
39  template <>
40  struct random_traits<random_iterator_r123::Philox2x64> {
41  typedef typename random_iterator_r123::Philox2x64::ctr_type state_type;
42  typedef typename random_iterator_r123::Philox2x64::key_type seed_type;
43  typedef typename random_iterator_r123::Philox2x64::ukey_type init_type;
44  typedef uint64_t advance_type;
45  typedef state_type::value_type result_type;
46 
47  enum { arity = 2 };
48  };
49 
50  template <>
51  struct random_traits<random_iterator_r123::Philox4x64> {
52  typedef typename random_iterator_r123::Philox4x64::ctr_type state_type;
53  typedef typename random_iterator_r123::Philox4x64::key_type seed_type;
54  typedef typename random_iterator_r123::Philox4x64::ukey_type init_type;
55  typedef uint64_t advance_type;
56  typedef state_type::value_type result_type;
57 
58  enum { arity = 4 };
59  };
60  //
61  template <>
62  struct random_traits<random_iterator_r123::Threefry2x64> {
63  typedef typename random_iterator_r123::Threefry2x64::ctr_type state_type;
64  typedef typename random_iterator_r123::Threefry2x64::key_type seed_type;
65  typedef typename random_iterator_r123::Threefry2x64::ukey_type init_type;
66  typedef uint64_t advance_type;
67  typedef state_type::value_type result_type;
68 
69  enum { arity = 2 };
70  };
71 
72  //
73  template <>
74  struct random_traits<random_iterator_r123::Threefry4x64> {
75  typedef typename random_iterator_r123::Threefry4x64::ctr_type state_type;
76  typedef typename random_iterator_r123::Threefry4x64::key_type seed_type;
77  typedef typename random_iterator_r123::Threefry4x64::ukey_type init_type;
78  typedef uint64_t advance_type;
79  typedef state_type::value_type result_type;
80 
81  enum { arity = 4 };
82  };
83 
84 #if RANDOM_ITERATOR_R123_USE_AES_NI
85  template <>
86  struct random_traits<random_iterator_r123::ARS4x32> {
87  typedef typename random_iterator_r123::ARS4x32::ctr_type state_type;
88  typedef typename random_iterator_r123::ARS4x32::key_type seed_type;
89  typedef typename random_iterator_r123::ARS4x32::ukey_type init_type;
90  typedef uint64_t advance_type;
91  typedef state_type::value_type result_type;
92 
93  enum { arity = 4 };
94  };
95 
96  template <>
97  struct random_traits<random_iterator_r123::ARS2x64> {
98  typedef typename random_iterator_r123::ARS2x64::ctr_type state_type;
99  typedef typename random_iterator_r123::ARS2x64::key_type seed_type;
100  typedef typename random_iterator_r123::ARS2x64::ukey_type init_type;
101  typedef uint64_t advance_type;
102  typedef state_type::value_type result_type;
103 
104  enum { arity = 2 };
105  };
106 
107 #endif
108 
109  } // namespace detail
110 
111 } // namespace random_iterator