#pragma once #include #include "duckdb/common/vector.hpp" #include "duckdb/common/unordered_map.hpp" #include "duckdb/common/unordered_set.hpp" namespace duckdb { class FormatSerializer; // Forward declare class FormatDeserializer; // Forward declare // Backport to c++11 template using void_t = void; // Check for anything implementing a `void FormatSerialize(FormatSerializer &FormatSerializer)` method template struct has_serialize : std::false_type {}; template struct has_serialize< T, typename std::enable_if< std::is_same().FormatSerialize(std::declval())), void>::value, T>::type> : std::true_type {}; template struct has_deserialize : std::false_type {}; // Accept `static unique_ptr FormatDeserialize(FormatDeserializer& deserializer)` template struct has_deserialize< T, typename std::enable_if(FormatDeserializer &)>::value, T>::type> : std::true_type {}; // Accept `static shared_ptr FormatDeserialize(FormatDeserializer& deserializer)` template struct has_deserialize< T, typename std::enable_if(FormatDeserializer &)>::value, T>::type> : std::true_type {}; // Accept `static T FormatDeserialize(FormatDeserializer& deserializer)` template struct has_deserialize< T, typename std::enable_if::value, T>::type> : std::true_type {}; // Check if T is a vector, and provide access to the inner type template struct is_vector : std::false_type {}; template struct is_vector> : std::true_type { typedef T ELEMENT_TYPE; }; // Check if T is a unordered map, and provide access to the inner type template struct is_unordered_map : std::false_type {}; template struct is_unordered_map> : std::true_type { typedef typename std::tuple_element<0, std::tuple>::type KEY_TYPE; typedef typename std::tuple_element<1, std::tuple>::type VALUE_TYPE; typedef typename std::tuple_element<2, std::tuple>::type HASH_TYPE; typedef typename std::tuple_element<3, std::tuple>::type EQUAL_TYPE; }; template struct is_unique_ptr : std::false_type {}; template struct is_unique_ptr> : std::true_type { typedef T ELEMENT_TYPE; }; template struct is_shared_ptr : std::false_type {}; template struct is_shared_ptr> : std::true_type { typedef T ELEMENT_TYPE; }; template struct is_pair : std::false_type {}; template struct is_pair> : std::true_type { typedef T FIRST_TYPE; typedef U SECOND_TYPE; }; template struct is_unordered_set : std::false_type {}; template struct is_unordered_set> : std::true_type { typedef typename std::tuple_element<0, std::tuple>::type ELEMENT_TYPE; typedef typename std::tuple_element<1, std::tuple>::type HASH_TYPE; typedef typename std::tuple_element<2, std::tuple>::type EQUAL_TYPE; }; template struct is_set : std::false_type {}; template struct is_set> : std::true_type { typedef typename std::tuple_element<0, std::tuple>::type ELEMENT_TYPE; typedef typename std::tuple_element<1, std::tuple>::type HASH_TYPE; typedef typename std::tuple_element<2, std::tuple>::type EQUAL_TYPE; }; } // namespace duckdb