| // 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 <string> |
| #include <typeindex> |
| |
| #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 <typename SerializationT> |
| 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 <typename H> |
| 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_ |