| // 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_ |