• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_
16 #define ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_
17 
18 #include "absl/meta/type_traits.h"
19 #include "absl/strings/string_view.h"
20 
21 namespace absl {
22 ABSL_NAMESPACE_BEGIN
23 namespace strings_internal {
24 
25 // StringConstant<T> represents a compile time string constant.
26 // It can be accessed via its `absl::string_view value` static member.
27 // It is guaranteed that the `string_view` returned has constant `.data()`,
28 // constant `.size()` and constant `value[i]` for all `0 <= i < .size()`
29 //
30 // The `T` is an opaque type. It is guaranteed that different string constants
31 // will have different values of `T`. This allows users to associate the string
32 // constant with other static state at compile time.
33 //
34 // Instances should be made using the `MakeStringConstant()` factory function
35 // below.
36 template <typename T>
37 struct StringConstant {
38  private:
39   // Returns true if `view` points to constant data.
40   // Otherwise, it can't be constant evaluated.
ValidateConstantStringConstant41   static constexpr bool ValidateConstant(absl::string_view view) {
42     return view.empty() || 2 * view[0] != 1;
43   }
44 
45  public:
46   static constexpr absl::string_view value = T{}();
operatorStringConstant47   constexpr absl::string_view operator()() const { return value; }
48 
49   static_assert(ValidateConstant(value),
50                 "The input string_view must point to constant data.");
51 };
52 
53 template <typename T>
54 constexpr absl::string_view StringConstant<T>::value;  // NOLINT
55 
56 // Factory function for `StringConstant` instances.
57 // It supports callables that have a constexpr default constructor and a
58 // constexpr operator().
59 // It must return an `absl::string_view` or `const char*` pointing to constant
60 // data. This is validated at compile time.
61 template <typename T>
MakeStringConstant(T)62 constexpr StringConstant<T> MakeStringConstant(T) {
63   return {};
64 }
65 
66 }  // namespace strings_internal
67 ABSL_NAMESPACE_END
68 }  // namespace absl
69 
70 #endif  // ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_
71