• 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   static constexpr absl::string_view value = T{}();
operatorStringConstant39   constexpr absl::string_view operator()() const { return value; }
40 
41   // Check to be sure `view` points to constant data.
42   // Otherwise, it can't be constant evaluated.
43   static_assert(value.empty() || 2 * value[0] != 1,
44                 "The input string_view must point to constant data.");
45 };
46 
47 template <typename T>
48 constexpr absl::string_view StringConstant<T>::value;  // NOLINT
49 
50 // Factory function for `StringConstant` instances.
51 // It supports callables that have a constexpr default constructor and a
52 // constexpr operator().
53 // It must return an `absl::string_view` or `const char*` pointing to constant
54 // data. This is validated at compile time.
55 template <typename T>
MakeStringConstant(T)56 constexpr StringConstant<T> MakeStringConstant(T) {
57   return {};
58 }
59 
60 }  // namespace strings_internal
61 ABSL_NAMESPACE_END
62 }  // namespace absl
63 
64 #endif  // ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_
65