// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #ifndef TINK_INTERNAL_PARSER_INDEX_H_ #define TINK_INTERNAL_PARSER_INDEX_H_ #include #include #include "absl/strings/string_view.h" #include "tink/internal/serialization.h" namespace crypto { namespace tink { namespace internal { class ParserIndex { public: // Create registry lookup key for a `SerializationT` type object with // `object_identifier`. Useful for key and parameters parsers. template static ParserIndex Create(absl::string_view object_identifier) { return ParserIndex(std::type_index(typeid(SerializationT)), object_identifier); } // Create registry lookup key for `serialization`. Useful for the // serialization registry. static ParserIndex Create(const Serialization& serialization) { return ParserIndex(std::type_index(typeid(serialization)), serialization.ObjectIdentifier()); } // Returns true if serialization type index and object identifier match. bool operator==(const ParserIndex& other) const { return index_ == other.index_ && object_identifier_ == other.object_identifier_; } // Required function to make `ParserIndex` hashable for Abseil hash maps. template friend H AbslHashValue(H h, const ParserIndex& index) { return H::combine(std::move(h), index.index_, index.object_identifier_); } private: ParserIndex(std::type_index index, absl::string_view object_identifier) : index_(index), object_identifier_(object_identifier) {} std::type_index index_; std::string object_identifier_; }; } // namespace internal } // namespace tink } // namespace crypto #endif // TINK_INTERNAL_PARSER_INDEX_H_