@@ -166,79 +166,43 @@ class ICEBERG_EXPORT Literal : public util::Formattable {
166166 std::shared_ptr<PrimitiveType> type_;
167167};
168168
169- template <TypeId type_id>
170- struct LiteralTraits {
171- using ValueType = void ;
172- };
173-
174- template <>
175- struct LiteralTraits <TypeId::kBoolean > {
176- using ValueType = bool ;
177- };
178-
179- template <>
180- struct LiteralTraits <TypeId::kInt > {
181- using ValueType = int32_t ;
182- };
183-
184- template <>
185- struct LiteralTraits <TypeId::kDate > {
186- using ValueType = int32_t ;
187- };
188-
189- template <>
190- struct LiteralTraits <TypeId::kLong > {
191- using ValueType = int64_t ;
192- };
193-
194- template <>
195- struct LiteralTraits <TypeId::kTime > {
196- using ValueType = int64_t ;
197- };
198-
199- template <>
200- struct LiteralTraits <TypeId::kTimestamp > {
201- using ValueType = int64_t ;
169+ // / \brief Hash function for Literal to facilitate use in unordered containers
170+ struct ICEBERG_EXPORT LiteralValueHash {
171+ std::size_t operator ()(const Literal::Value& value) const noexcept ;
202172};
203173
204- template <>
205- struct LiteralTraits <TypeId::kTimestampTz > {
206- using ValueType = int64_t ;
207- };
208-
209- template <>
210- struct LiteralTraits <TypeId::kFloat > {
211- using ValueType = float ;
212- };
213-
214- template <>
215- struct LiteralTraits <TypeId::kDouble > {
216- using ValueType = double ;
217- };
218-
219- template <>
220- struct LiteralTraits <TypeId::kDecimal > {
221- using ValueType = Decimal;
222- };
223-
224- template <>
225- struct LiteralTraits <TypeId::kString > {
226- using ValueType = std::string;
174+ struct ICEBERG_EXPORT LiteralHash {
175+ std::size_t operator ()(const Literal& value) const noexcept {
176+ return LiteralValueHash{}(value.value ());
177+ }
227178};
228179
229- template <>
230- struct LiteralTraits <TypeId:: kUuid > {
231- using ValueType = Uuid ;
180+ template <TypeId type_id >
181+ struct LiteralTraits {
182+ using ValueType = void ;
232183};
233184
234- template <>
235- struct LiteralTraits <TypeId::kBinary > {
236- using ValueType = std::vector<uint8_t >;
237- };
185+ #define DEFINE_LITERAL_TRAIT (TYPE_ID, VALUE_TYPE ) \
186+ template <> \
187+ struct LiteralTraits <TypeId::TYPE_ID> { \
188+ using ValueType = VALUE_TYPE; \
189+ };
238190
239- template <>
240- struct LiteralTraits <TypeId::kFixed > {
241- using ValueType = std::vector<uint8_t >;
242- };
191+ DEFINE_LITERAL_TRAIT (kBoolean , bool )
192+ DEFINE_LITERAL_TRAIT (kInt , int32_t )
193+ DEFINE_LITERAL_TRAIT (kDate , int32_t )
194+ DEFINE_LITERAL_TRAIT (kLong , int64_t )
195+ DEFINE_LITERAL_TRAIT (kTime , int64_t )
196+ DEFINE_LITERAL_TRAIT (kTimestamp , int64_t )
197+ DEFINE_LITERAL_TRAIT (kTimestampTz , int64_t )
198+ DEFINE_LITERAL_TRAIT (kFloat , float )
199+ DEFINE_LITERAL_TRAIT (kDouble , double )
200+ DEFINE_LITERAL_TRAIT (kDecimal , Decimal)
201+ DEFINE_LITERAL_TRAIT (kString , std::string)
202+ DEFINE_LITERAL_TRAIT (kUuid , Uuid)
203+ DEFINE_LITERAL_TRAIT (kBinary , std::vector<uint8_t >)
204+ DEFINE_LITERAL_TRAIT (kFixed , std::vector<uint8_t >)
205+
206+ #undef DEFINE_LITERAL_TRAIT
243207
244208} // namespace iceberg
0 commit comments