NSVD Reader  0.0.1
define.hpp
Go to the documentation of this file.
1 
5 /*
6  * These codes are licensed under CC0.
7  * http://creativecommons.org/publicdomain/zero/1.0/
8  */
9 #ifndef __NODAMUSHI_SVD_VALUE_DEFINE_HPP__
10 #define __NODAMUSHI_SVD_VALUE_DEFINE_HPP__
11 
12 #include "nodamushi/svd/value.hpp"
14 
15 namespace nodamushi{
16 namespace svd{
17 namespace details{
18 
19 # ifdef _ENABLE_GNU_TEMPLATE_STRING_
20 
21 template<char... name>struct value_type_builder_name
22 {
23  template<typename T,bool attribute,bool required>
24  using type = ::nodamushi::svd::value<T,attribute,required,name...>;
25 };
26 
27 template<typename T,bool attribute,bool required,typename name>struct value_type_builder
28 {
29  using type = typename name::template type<T,attribute,required>;
30 };
31 
32 # else
33 
34 template<typename T,bool attribute,bool required,char... name>struct value_type_builder
35 {
36  static constexpr size_t size = get_const_string_length<name...>();
37  static constexpr char get_char(size_t index){return ::nodamushi::at_const_string<name...>(index);}
38 
39  template<typename s>struct seq;
40  template<size_t... s>struct seq<std::integer_sequence<size_t, s...>>{
41  using type = value<T,attribute,required,get_char(s)...>;};
42 
44 };
45 # endif
46 
47 } // end namespace nodamushi::svd::details
48 
49 
50 # ifdef _ENABLE_GNU_TEMPLATE_STRING_
51 
52 template<typename T,bool attribute,bool required,typename name>
54 
55 template<typename C,C... name>
56 constexpr ::nodamushi::svd::details::value_type_builder_name<name...> operator ""_value_type_builder(){return {};}
57 
58 # else
59 
60 template<typename T,bool attribute,bool required,char... name>
61 using value_t = typename details::value_type_builder<T,attribute,required,name...>::type;
62 
63 # endif
64 
65 }} // end namespace nodamushi::svd
66 
67 
68 
69 #define _SVD_VALUE_(type,name,attribute,reqired,MACRO,...) MACRO(type,name,attribute,required)
70 #define _SVD_VALUE0_(type,name,attribute,dummy) __SVD_VALUE__(type,attribute,false,name)
71 #define _SVD_VALUE1_(type,name,attribute,required) __SVD_VALUE__(type,attribute,required,name)
72 
73 # define __SVD_VALUE__(type,attribute,required,name) \
74  ::nodamushi::svd::value_t<type,attribute,required,__SVD_VALUE_EXPAND_NAME__(name)> name
75 
76 
77 # ifdef _ENABLE_GNU_TEMPLATE_STRING_
78 # define __SVD_VALUE_EXPAND_NAME__(name)\
79  decltype(#name##_value_type_builder)
80 
81 # else
82 
83 # define __SVD_VALUE_EXPAND_NAME__(name) __SVD_VALUE_EXPAND_NAME2__(#name)
84 # define __SVD_VALUE_EXPAND_NAME2__(name) ::nodamushi::at0<32>(name),::nodamushi::at(name,1 ),::nodamushi::at(name,2 ),::nodamushi::at(name,3 ),::nodamushi::at(name,4 ),::nodamushi::at(name,5 ),::nodamushi::at(name,6 ),::nodamushi::at(name,7 ),::nodamushi::at(name,8 ),::nodamushi::at(name,9 ),::nodamushi::at(name,10),::nodamushi::at(name,11),::nodamushi::at(name,12),::nodamushi::at(name,13),::nodamushi::at(name,14),::nodamushi::at(name,15),::nodamushi::at(name,16),::nodamushi::at(name,17),::nodamushi::at(name,18),::nodamushi::at(name,19),::nodamushi::at(name,20),::nodamushi::at(name,21),::nodamushi::at(name,22),::nodamushi::at(name,23),::nodamushi::at(name,24),::nodamushi::at(name,25),::nodamushi::at(name,26),::nodamushi::at(name,27),::nodamushi::at(name,28),::nodamushi::at(name,29),::nodamushi::at(name,30),::nodamushi::at(name,31)
85 
86 # endif
87 #endif // __NODAMUSHI_SVD_VALUE_DEFINE_HPP__
static constexpr char get_char(size_t index)
Definition: define.hpp:37
Definition: Access.hpp:143
constexpr char at_const_string(size_t index)
typename details::value_type_builder< T, attribute, required, name... >::type value_t
Definition: define.hpp:61
constexpr size_t get_const_string_length()
This class reperesents SVD(xml) element / attribute.
Definition: value.hpp:53
typename seq< std::make_integer_sequence< size_t, size > >::type type
Definition: define.hpp:43
constexpr small library
value class, empty_value_access_error class