SeqAn3
reflection.hpp
Go to the documentation of this file.
1 // ============================================================================
2 // SeqAn - The Library for Sequence Analysis
3 // ============================================================================
4 //
5 // Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin
6 // Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of Knut Reinert or the FU Berlin nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
25 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 // DAMAGE.
32 //
33 // ============================================================================
34 
40 #pragma once
41 
42 #include <utility>
43 
45 
46 namespace seqan3::detail
47 {
48 
59 template <typename type>
60 struct get_display_name_size
61 {
62 private:
64  static constexpr auto get_size()
65  {
66  // __PRETTY_FUNCTION__ exposes the signature of the class including the name of the template instance as
67  // a static const char[]. The following code, extracts the part that displays the template name.
68  auto name_ptr = __PRETTY_FUNCTION__;
69 
70  // Move pointer to first letter of actual type name.
71  while (*name_ptr++ != '=')
72  {}
73 
74  for (; *name_ptr == ' '; ++name_ptr)
75  {}
76 
77  // Find the end of the actual type name.
78  char const * end_name_ptr = name_ptr;
79  int count = 1;
80 
81  for (; ; ++end_name_ptr)
82  {
83  switch (*end_name_ptr)
84  {
85  case '[':
86  ++count;
87  break;
88  case ']':
89  --count;
90  if (!count)
91  return size_t(end_name_ptr - name_ptr);
92  break;
93  }
94  }
95  return size_t(0);
96  };
97 
98 public:
100  static constexpr size_t value = get_size();
101 };
102 
106 template <typename type>
107 constexpr size_t get_display_name_size_v = get_display_name_size<type>::value;
108 
122 template <typename type>
123 struct get_display_name
124 {
125 private:
127  static constexpr auto get_display_name_fn()
128  {
129  // Use a helper function to extract the size of the requested type.
130  constexpr_string<get_display_name_size_v<type>> tmp{};
131 
132  // Extract the type again.
133  auto name_ptr = __PRETTY_FUNCTION__;
134 
135  // Move pointer to first letter of actual type name.
136  while (*name_ptr++ != '=')
137  {}
138 
139  for (; *name_ptr == ' '; ++name_ptr)
140  {}
141 
142  for (unsigned i = 0; i < tmp.size(); ++i, ++name_ptr)
143  {
144  tmp[i] = *name_ptr;
145  }
146  return tmp;
147  };
148 public:
150  static constexpr constexpr_string value = get_display_name_fn();
151 };
152 
156 template <typename type>
157 constexpr constexpr_string get_display_name_v = get_display_name<type>::value;
158 } // namespace seqan3::detail
A constexpr string implementation to manipulate string literals at compile time.
Definition: aligned_sequence_concept.hpp:288