cef/libcef_dll/template_util.h

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_