From 19ce24de5e8ef31be2925074e962ae23aaf65be0 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Fri, 23 Aug 2024 20:05:22 +0200 Subject: Some work on ptr --- asl/ptr.hpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 asl/ptr.hpp (limited to 'asl/ptr.hpp') diff --git a/asl/ptr.hpp b/asl/ptr.hpp new file mode 100644 index 0000000..2d90e7b --- /dev/null +++ b/asl/ptr.hpp @@ -0,0 +1,74 @@ +#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 -- cgit