Skip to content

Commit b4bee74

Browse files
jckingcopybara-github
authored andcommitted
Rework OpaqueType and OpaqueTypeView
PiperOrigin-RevId: 586412480
1 parent 69289cb commit b4bee74

5 files changed

Lines changed: 204 additions & 535 deletions

File tree

common/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,10 @@ cc_library(
275275
"//internal:status_macros",
276276
"//internal:strings",
277277
"//internal:time",
278+
"@com_google_absl//absl/algorithm:container",
278279
"@com_google_absl//absl/base:core_headers",
279280
"@com_google_absl//absl/base:nullability",
281+
"@com_google_absl//absl/container:fixed_array",
280282
"@com_google_absl//absl/container:flat_hash_map",
281283
"@com_google_absl//absl/hash",
282284
"@com_google_absl//absl/log:absl_check",
@@ -289,6 +291,7 @@ cc_library(
289291
"@com_google_absl//absl/strings:string_view",
290292
"@com_google_absl//absl/time",
291293
"@com_google_absl//absl/types:optional",
294+
"@com_google_absl//absl/types:span",
292295
"@com_google_absl//absl/types:variant",
293296
"@com_google_absl//absl/utility",
294297
],

common/type.h

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,19 @@
2222
#include <type_traits>
2323
#include <utility>
2424

25+
#include "absl/algorithm/container.h"
2526
#include "absl/base/attributes.h"
2627
#include "absl/base/optimization.h"
27-
#include "absl/hash/hash.h"
28+
#include "absl/container/fixed_array.h"
2829
#include "absl/log/absl_check.h"
2930
#include "absl/log/absl_log.h"
3031
#include "absl/meta/type_traits.h"
3132
#include "absl/strings/string_view.h"
33+
#include "absl/types/span.h"
3234
#include "absl/types/variant.h"
3335
#include "common/casting.h"
3436
#include "common/memory.h"
3537
#include "common/native_type.h"
36-
#include "common/sized_input_view.h"
3738
#include "common/type_interface.h" // IWYU pragma: export
3839
#include "common/type_kind.h"
3940
#include "common/types/any_type.h" // IWYU pragma: export
@@ -663,6 +664,16 @@ struct MapTypeData final {
663664
const Type value;
664665
};
665666

667+
struct OpaqueTypeData final {
668+
using Parameters = absl::FixedArray<Type, 1>;
669+
670+
explicit OpaqueTypeData(std::string name, Parameters parameters)
671+
: name(std::move(name)), parameters(std::move(parameters)) {}
672+
673+
const std::string name;
674+
const Parameters parameters;
675+
};
676+
666677
} // namespace common_internal
667678

668679
template <>
@@ -746,23 +757,17 @@ inline H AbslHashValue(H state, MapTypeView type) {
746757
return H::combine(std::move(state), type.kind(), type.key(), type.value());
747758
}
748759

749-
inline SizedInputView<TypeView> OpaqueType::parameters() const {
750-
return interface_->parameters();
760+
inline OpaqueType::OpaqueType(OpaqueTypeView other) : data_(other.data_) {}
761+
762+
inline absl::string_view OpaqueType::name() const { return data_->name; }
763+
764+
inline absl::Span<const Type> OpaqueType::parameters() const {
765+
return data_->parameters;
751766
}
752767

753768
inline bool operator==(const OpaqueType& lhs, const OpaqueType& rhs) {
754-
if (lhs.interface_.operator->() == rhs.interface_.operator->()) {
755-
return true;
756-
}
757-
auto lhs_parameters = lhs.parameters();
758-
auto rhs_parameters = rhs.parameters();
759-
if (lhs_parameters.size() != rhs_parameters.size()) {
760-
return false;
761-
}
762769
return lhs.name() == rhs.name() &&
763-
std::equal(lhs_parameters.begin(), lhs_parameters.end(),
764-
rhs_parameters.begin()) &&
765-
lhs.interface_->Equals(*rhs.interface_);
770+
absl::c_equal(lhs.parameters(), rhs.parameters());
766771
}
767772

768773
template <typename H>
@@ -772,27 +777,21 @@ inline H AbslHashValue(H state, const OpaqueType& type) {
772777
for (const auto& parameter : parameters) {
773778
state = H::combine(std::move(state), parameter);
774779
}
775-
type.interface_->HashValue(absl::HashState::Create(&state));
776780
return std::move(state);
777781
}
778782

779-
inline SizedInputView<TypeView> OpaqueTypeView::parameters() const {
780-
return interface_->parameters();
783+
inline OpaqueTypeView::OpaqueTypeView(const OpaqueType& type) noexcept
784+
: data_(type.data_) {}
785+
786+
inline absl::string_view OpaqueTypeView::name() const { return data_->name; }
787+
788+
inline absl::Span<const Type> OpaqueTypeView::parameters() const {
789+
return data_->parameters;
781790
}
782791

783792
inline bool operator==(OpaqueTypeView lhs, OpaqueTypeView rhs) {
784-
if (lhs.interface_.operator->() == rhs.interface_.operator->()) {
785-
return true;
786-
}
787-
auto lhs_parameters = lhs.parameters();
788-
auto rhs_parameters = rhs.parameters();
789-
if (lhs_parameters.size() != rhs_parameters.size()) {
790-
return false;
791-
}
792793
return lhs.name() == rhs.name() &&
793-
std::equal(lhs_parameters.begin(), lhs_parameters.end(),
794-
rhs_parameters.begin()) &&
795-
lhs.interface_->Equals(*rhs.interface_);
794+
absl::c_equal(lhs.parameters(), rhs.parameters());
796795
}
797796

798797
template <typename H>
@@ -802,7 +801,6 @@ inline H AbslHashValue(H state, OpaqueTypeView type) {
802801
for (const auto& parameter : parameters) {
803802
state = H::combine(std::move(state), parameter);
804803
}
805-
type.interface_->HashValue(absl::HashState::Create(&state));
806804
return std::move(state);
807805
}
808806

common/types/opaque_type.cc

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,58 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <cstddef>
1516
#include <string>
17+
#include <utility>
1618

19+
#include "absl/container/fixed_array.h"
20+
#include "absl/log/absl_check.h"
1721
#include "absl/strings/str_cat.h"
1822
#include "absl/strings/str_join.h"
23+
#include "absl/strings/string_view.h"
24+
#include "absl/types/span.h"
25+
#include "common/memory.h"
1926
#include "common/sized_input_view.h"
2027
#include "common/type.h"
2128

2229
namespace cel {
2330

24-
std::string OpaqueTypeInterface::DebugString() const {
25-
auto parameters = this->parameters();
31+
namespace {
32+
33+
std::string OpaqueDebugString(absl::string_view name,
34+
absl::Span<const Type> parameters) {
2635
if (parameters.empty()) {
27-
return std::string(name());
36+
return std::string(name);
37+
}
38+
return absl::StrCat(
39+
name, "<", absl::StrJoin(parameters, ", ", absl::StreamFormatter()), ">");
40+
}
41+
42+
absl::FixedArray<Type, 1> SizedInputViewToFixedArray(
43+
SizedInputView<TypeView> parameters) {
44+
absl::FixedArray<Type, 1> fixed_parameters(parameters.size(), DynType());
45+
size_t index = 0;
46+
for (const auto& parameter : parameters) {
47+
fixed_parameters[index++] = Type(parameter);
2848
}
29-
return absl::StrCat(name(), "<",
30-
absl::StrJoin(parameters, ", ", absl::StreamFormatter()),
31-
">");
49+
ABSL_DCHECK_EQ(index, parameters.size());
50+
return fixed_parameters;
51+
}
52+
53+
} // namespace
54+
55+
OpaqueType::OpaqueType(MemoryManagerRef memory_manager, absl::string_view name,
56+
SizedInputView<TypeView> parameters)
57+
: data_(memory_manager.MakeShared<common_internal::OpaqueTypeData>(
58+
std::string(name),
59+
SizedInputViewToFixedArray(std::move(parameters)))) {}
60+
61+
std::string OpaqueType::DebugString() const {
62+
return OpaqueDebugString(name(), parameters());
3263
}
3364

34-
SizedInputView<TypeView> OpaqueTypeInterface::parameters() const {
35-
return SizedInputView<TypeView>();
65+
std::string OpaqueTypeView::DebugString() const {
66+
return OpaqueDebugString(name(), parameters());
3667
}
3768

3869
} // namespace cel

0 commit comments

Comments
 (0)