tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

string_constant.h (2439B)


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