2 //===----------------------------------------------------------------------===//
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
8 //===----------------------------------------------------------------------===//
10 #ifndef BENCHMARK_UTILITIES_H
11 #define BENCHMARK_UTILITIES_H
14 #include <type_traits>
16 #include "benchmark/benchmark.h"
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
;
24 using HasData
= decltype(HaveDataImpl
<T
>(0));
25 } // namespace UtilitiesInternal
27 template <class Container
, std::enable_if_t
<UtilitiesInternal::HasData
<Container
>::value
>* = nullptr>
28 void DoNotOptimizeData(Container
&c
) { benchmark::DoNotOptimize(c
.data()); }
29 template <class Container
, std::enable_if_t
<!UtilitiesInternal::HasData
<Container
>::value
>* = nullptr>
30 void DoNotOptimizeData(Container
&c
) { benchmark::DoNotOptimize(&c
); }
33 #endif // BENCHMARK_UTILITIES_H