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