#pragma once #include "asl/integers.hpp" #include "asl/meta.hpp" namespace asl { namespace ptr_internal { template struct void_metadata { using metadata = empty; using pointee = T; }; template struct array_metadata {}; template struct array_metadata { using metadata = isize_t; using pointee = T; }; template struct array_metadata { using metadata = empty; using pointee = T[N]; }; template struct object_metadata { using metadata = empty; using pointee = T; }; template struct func_metadata { using metadata = empty; using pointee = tame_t*; }; template struct ref_metadata { using metadata = empty; using pointee = un_ref_t*; }; template void_metadata select_ptr_metadata(types); template array_metadata select_ptr_metadata(types); template object_metadata select_ptr_metadata(types) requires (!is_array); template func_metadata select_ptr_metadata(types); template ref_metadata select_ptr_metadata(types); template using metadata = decltype(select_ptr_metadata(types{})); } // namespace ptr_internal template concept ptr_metadata = requires { is_object; is_object; }; } // namespace asl