diff foosdk/sdk/pfc/traits.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/traits.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,85 @@
+#pragma once
+
+namespace pfc {
+
+	class traits_default {
+	public:
+		enum { 
+			realloc_safe = false, 
+			needs_destructor = true, 
+			needs_constructor = true, 
+			constructor_may_fail = true
+		};
+	};
+	
+	class traits_default_movable {
+	public:
+		enum { 
+			realloc_safe = true, 
+			needs_destructor = true, 
+			needs_constructor = true, 
+			constructor_may_fail = true
+		};
+	};
+
+	class traits_rawobject : public traits_default {
+	public:
+		enum { 
+			realloc_safe = true, 
+			needs_destructor = false, 
+			needs_constructor = false, 
+			constructor_may_fail = false
+		};
+	};
+
+	class traits_vtable {
+	public:
+		enum {
+			realloc_safe = true,
+			needs_destructor = true,
+			needs_constructor = true,
+			constructor_may_fail = false
+		};
+	};
+
+	template<typename T> class traits_t : public traits_default {};
+
+	template<typename traits1,typename traits2>
+	class combine_traits {
+	public:
+		enum {
+			realloc_safe = (traits1::realloc_safe && traits2::realloc_safe),
+			needs_destructor = (traits1::needs_destructor || traits2::needs_destructor),
+			needs_constructor = (traits1::needs_constructor || traits2::needs_constructor),
+			constructor_may_fail = (traits1::constructor_may_fail || traits2::constructor_may_fail),
+		};
+	};
+
+	template<typename type1, typename type2>
+	class traits_combined : public combine_traits<traits_t<type1>,traits_t<type2> > {};
+
+	template<typename T> class traits_t<T*> : public traits_rawobject {};
+
+	template<> class traits_t<char> : public traits_rawobject {};
+	template<> class traits_t<unsigned char> : public traits_rawobject {};
+	template<> class traits_t<signed char> : public traits_rawobject {};
+	template<> class traits_t<wchar_t> : public traits_rawobject {};
+	template<> class traits_t<short> : public traits_rawobject {};
+	template<> class traits_t<unsigned short> : public traits_rawobject {};
+	template<> class traits_t<int> : public traits_rawobject {};
+	template<> class traits_t<unsigned int> : public traits_rawobject {};
+	template<> class traits_t<long> : public traits_rawobject {};
+	template<> class traits_t<unsigned long> : public traits_rawobject {};
+	template<> class traits_t<long long> : public traits_rawobject {};
+	template<> class traits_t<unsigned long long> : public traits_rawobject {};
+	template<> class traits_t<bool> : public traits_rawobject {};
+
+	template<> class traits_t<float> : public traits_rawobject {};
+	template<> class traits_t<double> : public traits_rawobject {};
+	
+	template<> class traits_t<GUID> : public traits_rawobject {};
+
+	template<typename T,t_size p_count>
+	class traits_t<T[p_count]> : public traits_t<T> {};
+
+}