1*4d6fc14bSjoerg // -*- C++ -*- 2*4d6fc14bSjoerg //===----------------------------------------------------------------------===// 3*4d6fc14bSjoerg // 4*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg // 8*4d6fc14bSjoerg //===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg #ifndef BENCHMARK_UTILITIES_H 11*4d6fc14bSjoerg #define BENCHMARK_UTILITIES_H 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg #include <cassert> 14*4d6fc14bSjoerg #include <type_traits> 15*4d6fc14bSjoerg 16*4d6fc14bSjoerg #include "benchmark/benchmark.h" 17*4d6fc14bSjoerg 18*4d6fc14bSjoerg namespace UtilitiesInternal { 19*4d6fc14bSjoerg template <class Container> 20*4d6fc14bSjoerg auto HaveDataImpl(int) -> decltype((std::declval<Container&>().data(), std::true_type{})); 21*4d6fc14bSjoerg template <class Container> 22*4d6fc14bSjoerg auto HaveDataImpl(long) -> std::false_type; 23*4d6fc14bSjoerg template <class T> 24*4d6fc14bSjoerg using HasData = decltype(HaveDataImpl<T>(0)); 25*4d6fc14bSjoerg } // namespace UtilitiesInternal 26*4d6fc14bSjoerg 27*4d6fc14bSjoerg template <class Container, std::enable_if_t<UtilitiesInternal::HasData<Container>::value>* = nullptr> DoNotOptimizeData(Container & c)28*4d6fc14bSjoergvoid DoNotOptimizeData(Container &c) { benchmark::DoNotOptimize(c.data()); } 29*4d6fc14bSjoerg template <class Container, std::enable_if_t<!UtilitiesInternal::HasData<Container>::value>* = nullptr> DoNotOptimizeData(Container & c)30*4d6fc14bSjoergvoid DoNotOptimizeData(Container &c) { benchmark::DoNotOptimize(&c); } 31*4d6fc14bSjoerg 32*4d6fc14bSjoerg 33*4d6fc14bSjoerg #endif // BENCHMARK_UTILITIES_H 34