summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/libcxx/benchmarks/Utilities.h
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/libcxx/benchmarks/Utilities.h')
-rw-r--r--gnu/llvm/libcxx/benchmarks/Utilities.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/gnu/llvm/libcxx/benchmarks/Utilities.h b/gnu/llvm/libcxx/benchmarks/Utilities.h
new file mode 100644
index 00000000000..9ad2a58796e
--- /dev/null
+++ b/gnu/llvm/libcxx/benchmarks/Utilities.h
@@ -0,0 +1,33 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef BENCHMARK_UTILITIES_H
+#define BENCHMARK_UTILITIES_H
+
+#include <cassert>
+#include <type_traits>
+
+#include "benchmark/benchmark.h"
+
+namespace UtilitiesInternal {
+ template <class Container>
+ auto HaveDataImpl(int) -> decltype((std::declval<Container&>().data(), std::true_type{}));
+ template <class Container>
+ auto HaveDataImpl(long) -> std::false_type;
+ template <class T>
+ using HasData = decltype(HaveDataImpl<T>(0));
+} // namespace UtilitiesInternal
+
+template <class Container, std::enable_if_t<UtilitiesInternal::HasData<Container>::value>* = nullptr>
+void DoNotOptimizeData(Container &c) { benchmark::DoNotOptimize(c.data()); }
+template <class Container, std::enable_if_t<!UtilitiesInternal::HasData<Container>::value>* = nullptr>
+void DoNotOptimizeData(Container &c) { benchmark::DoNotOptimize(&c); }
+
+
+#endif // BENCHMARK_UTILITIES_H