38 lines
1.1 KiB
C
38 lines
1.1 KiB
C
|
// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
|
||
|
// reserved. Use of this source code is governed by a BSD-style license that
|
||
|
// can be found in the LICENSE file.
|
||
|
|
||
|
#ifndef CEF_LIBCEF_DLL_TEMPLATE_UTIL_H_
|
||
|
#define CEF_LIBCEF_DLL_TEMPLATE_UTIL_H_
|
||
|
#pragma once
|
||
|
|
||
|
#include <type_traits>
|
||
|
|
||
|
namespace template_util {
|
||
|
|
||
|
// Used to detect whether the given C struct has a size_t size field or has a
|
||
|
// base field and a base field has a size field.
|
||
|
template <typename T, typename = void>
|
||
|
struct HasValidSize {
|
||
|
bool operator()(const T*) { return true; }
|
||
|
};
|
||
|
template <typename T>
|
||
|
struct HasValidSize<
|
||
|
T,
|
||
|
typename std::enable_if_t<std::is_same<decltype(T::size), size_t>::value>> {
|
||
|
bool operator()(const T* s) { return s->size == sizeof(*s); }
|
||
|
};
|
||
|
template <typename T>
|
||
|
struct HasValidSize<T, decltype(void(T::base.size))> {
|
||
|
bool operator()(const T* s) { return s->base.size == sizeof(*s); }
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
inline bool has_valid_size(const T* s) {
|
||
|
return HasValidSize<T>()(s);
|
||
|
}
|
||
|
|
||
|
} // namespace template_util
|
||
|
|
||
|
#endif // CEF_LIBCEF_DLL_TEMPLATE_UTIL_H_
|