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
668679template <>
@@ -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
753768inline 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
768773template <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
783792inline 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
798797template <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
0 commit comments