xref: /netbsd-src/external/apache2/llvm/dist/libcxx/benchmarks/Utilities.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
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*4d6fc14bSjoerg void 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*4d6fc14bSjoerg void DoNotOptimizeData(Container &c) { benchmark::DoNotOptimize(&c); }
31*4d6fc14bSjoerg 
32*4d6fc14bSjoerg 
33*4d6fc14bSjoerg #endif // BENCHMARK_UTILITIES_H
34