20#ifndef PLYWOOT_TYPE_TRAITS_HPP
21#define PLYWOOT_TYPE_TRAITS_HPP
32namespace plywoot::detail {
39 static constexpr bool value =
false;
42template<
typename T, std::
size_t N>
43struct IsList<reflect::Array<T, N>>
45 static constexpr bool value =
true;
49struct IsList<std::vector<T>>
51 static constexpr bool value =
true;
55struct IsList<reflect::Type<T>>
57 static constexpr bool value = IsList<T>::value;
68 return IsList<T>::value;
75template<
typename... Ts>
78 static constexpr std::size_t size = 0;
81template<
typename T,
typename... Ts>
82struct NumProperties<T, Ts...>
84 static constexpr std::size_t size = NumProperties<T>::size + NumProperties<Ts...>::size;
87template<
typename T, std::
size_t N>
88struct NumProperties<reflect::Array<T, N>>
90 static constexpr std::size_t size = 1;
93template<
typename T, std::
size_t N>
94struct NumProperties<reflect::Pack<T, N>>
96 static constexpr std::size_t size = N;
100struct NumProperties<reflect::Stride<T>>
102 static constexpr std::size_t size = 0;
106struct NumProperties<T>
108 static constexpr std::size_t size = 1;
117template<
typename... Ts>
120 return NumProperties<Ts...>::size;
134 case PlyDataType::Char:
135 return std::is_same<T, char>::value;
136 case PlyDataType::UChar:
137 return std::is_same<T, unsigned char>::value;
138 case PlyDataType::Short:
139 return std::is_same<T, short>::value;
140 case PlyDataType::UShort:
141 return std::is_same<T, unsigned short>::value;
142 case PlyDataType::Int:
143 return std::is_same<T, int>::value;
144 case PlyDataType::UInt:
145 return std::is_same<T, unsigned int>::value;
146 case PlyDataType::Float:
147 return std::is_same<T, float>::value;
148 case PlyDataType::Double:
149 return std::is_same<T, double>::value;
161 static constexpr bool value =
false;
164template<
typename T, std::
size_t N>
165struct IsPack<reflect::Pack<T, N>>
167 static constexpr bool value =
true;
177template<
typename T,
typename... Ts>
180 static constexpr auto size = SizeOf<T>::size + SizeOf<Ts...>::size;
186 static constexpr auto size =
sizeof(T);
189template<
typename T, std::
size_t N>
190struct SizeOf<reflect::Array<T, N>>
192 static constexpr auto size = N * SizeOf<T>::size;
195template<
typename T, std::
size_t N>
196struct SizeOf<reflect::Pack<T, N>>
198 static constexpr auto size = N * SizeOf<T>::size;
210template<
typename... Ts>
213 return SizeOf<Ts...>::size;
224 case PlyDataType::Char:
225 case PlyDataType::UChar:
227 case PlyDataType::Short:
228 case PlyDataType::UShort:
230 case PlyDataType::Int:
231 case PlyDataType::UInt:
232 case PlyDataType::Float:
234 case PlyDataType::Double:
248template<
typename Ptr>
253 case PlyDataType::Char:
254 return detail::align(ptr,
alignof(
char));
255 case PlyDataType::UChar:
256 return detail::align(ptr,
alignof(
unsigned char));
257 case PlyDataType::Short:
258 return detail::align(ptr,
alignof(
short));
259 case PlyDataType::UShort:
260 return detail::align(ptr,
alignof(
unsigned short));
261 case PlyDataType::Int:
262 return detail::align(ptr,
alignof(
int));
263 case PlyDataType::UInt:
264 return detail::align(ptr,
alignof(
unsigned int));
265 case PlyDataType::Float:
266 return detail::align(ptr,
alignof(
float));
267 case PlyDataType::Double:
268 return detail::align(ptr,
alignof(
double));
285 return (offset %
alignof(T)) == 0;
294template<
typename T,
typename U,
typename... Ts>
297 return (offset %
alignof(T)) == 0 &&
isPacked<U, Ts...>(offset + sizeOf<T>());
307template<
typename... Ts>
310 return (std::is_trivially_copyable_v<Ts> && ...);
322 return first < last && isSame<T>(first->type());
326template<
typename T, std::
size_t N>
327struct IsMemcpyable<reflect::Array<T, N>>
329 bool operator()(
const PlyPropertyConstIterator,
const PlyPropertyConstIterator)
const {
return false; }
333template<
typename T, std::
size_t N>
334struct IsMemcpyable<reflect::Pack<T, N>>
336 bool operator()(
const PlyPropertyConstIterator first,
const PlyPropertyConstIterator last)
const
338 return first + N <= last &&
339 std::all_of(first, first + N, [](
const PlyProperty &p) {
return isSame<T>(p.type()); });
357 return first + detail::numProperties<T>() == last && IsMemcpyable<T>{}(first, last);
371template<
typename T,
typename U,
typename... Ts>
374 return IsMemcpyable<T>{}(first, last) && isMemcpyable<U, Ts...>(first + detail::numProperties<T>(), last);
constexpr Ptr align(Ptr ptr, std::size_t alignment)
constexpr bool isTriviallyCopyable()
constexpr std::size_t numProperties()
constexpr bool isPacked(uintptr_t offset=0)
constexpr std::size_t sizeOf()
bool isMemcpyable(const PlyPropertyConstIterator first, const PlyPropertyConstIterator last)
constexpr bool isSame(PlyDataType type)
std::vector< PlyProperty >::const_iterator PlyPropertyConstIterator
PlyDataType
Enumeration of data types supported by the PLY format.