File: enumeration_base.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (138 lines) | stat: -rw-r--r-- 4,872 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_ENUMERATION_BASE_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_ENUMERATION_BASE_H_

#include <concepts>
#include <type_traits>

#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "v8/include/v8.h"

namespace blink {

namespace bindings {

class PLATFORM_EXPORT EnumerationBase {
  DISALLOW_NEW();

 public:
  ~EnumerationBase() = default;

  // Returns the IDL enumeration value as a string.
  // https://webidl.spec.whatwg.org/#dfn-enumeration-value
  const char* AsCStr() const { return string_literal_; }
  String AsString() const { return string_literal_; }
  AtomicString AsAtomicString() const { return AtomicString(string_literal_); }

  // Returns the string representation to be used by CHECK_OP family.
  // This member function is meant only for CHECK_EQ, etc.
  String ToString() const {
    return String::Format("IDL enum value \"%s\"", string_literal_);
  }

  // Returns true if the value is invalid.  The instance in this state must be
  // created only when an exception is thrown.
  bool IsEmpty() const { return !string_literal_; }

 protected:
  // Integer type that is convertible from/to enum values defined in subclasses.
  using enum_int_t = size_t;

  constexpr EnumerationBase() = default;
  explicit constexpr EnumerationBase(enum_int_t enum_value,
                                     const char* string_literal)
      : enum_value_(enum_value), string_literal_(string_literal) {}
  constexpr EnumerationBase(const EnumerationBase&) = default;
  constexpr EnumerationBase(EnumerationBase&&) = default;

  EnumerationBase& operator=(const EnumerationBase&) = default;
  EnumerationBase& operator=(EnumerationBase&&) = default;

  enum_int_t GetEnumValue() const { return enum_value_; }

 private:
  // Subclasses are supposed to define a C++ enum class and a table of strings
  // that represent IDL enumeration values.  |enum_value_| is an enum value of
  // the C++ enum class (must be convertible from/to enum_int_t) and
  // |string_literal_| is a pointer to a string in the table.
  enum_int_t enum_value_ = 0;
  const char* string_literal_ = nullptr;
};

}  // namespace bindings

template <typename EnumTypeClass>
  requires(std::derived_from<EnumTypeClass, bindings::EnumerationBase>)
bool operator==(const EnumTypeClass& lhs, const EnumTypeClass& rhs) {
  DCHECK(!lhs.IsEmpty() && !rhs.IsEmpty());
  return lhs.AsEnum() == rhs.AsEnum();
}

template <typename EnumTypeClass>
  requires(std::derived_from<EnumTypeClass, bindings::EnumerationBase>)
bool operator==(const EnumTypeClass& lhs, typename EnumTypeClass::Enum rhs) {
  DCHECK(!lhs.IsEmpty());
  return lhs.AsEnum() == rhs;
}

template <typename EnumTypeClass>
  requires(std::derived_from<EnumTypeClass, bindings::EnumerationBase>)
bool operator==(typename EnumTypeClass::Enum lhs, const EnumTypeClass& rhs) {
  DCHECK(!rhs.IsEmpty());
  return lhs == rhs.AsEnum();
}

// Migration adapters
template <typename EnumTypeClass>
  requires(std::derived_from<EnumTypeClass, bindings::EnumerationBase>)
bool operator==(const EnumTypeClass& lhs, const String& rhs) {
  DCHECK(!lhs.IsEmpty());
  return lhs.AsString() == rhs;
}

template <typename EnumTypeClass>
  requires(std::derived_from<EnumTypeClass, bindings::EnumerationBase>)
bool operator==(const EnumTypeClass& lhs, const AtomicString& rhs) {
  DCHECK(!lhs.IsEmpty());
  return lhs.AsString() == rhs;
}

template <typename EnumTypeClass>
typename std::enable_if_t<
    std::is_base_of<bindings::EnumerationBase, EnumTypeClass>::value,
    bool>
operator==(const EnumTypeClass& lhs, const char* rhs) {
  DCHECK(!lhs.IsEmpty());
  return lhs.AsString() == rhs;
}

template <typename EnumTypeClass>
typename std::enable_if_t<
    std::is_base_of<bindings::EnumerationBase, EnumTypeClass>::value,
    bool>
operator==(const char* lhs, const EnumTypeClass& rhs) {
  return rhs == lhs;
}

// TODO(crbug.com/1092328): IDLEnumAsString is an adapter between the old and
// new bindings generators.  The old bindings generator implements IDL
// enumeration with String class, however, the new bindings generator implements
// it with subclasses of EnumerationBase.  IDLEnumAsString resolves this
// difference.
inline const String& IDLEnumAsString(const String& value) {
  return value;
}

inline String IDLEnumAsString(const bindings::EnumerationBase& value) {
  return value.AsString();
}

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_ENUMERATION_BASE_H_