1a8c51b3fSopenharmony_ci// Copyright 2015 Google Inc. All rights reserved.
2a8c51b3fSopenharmony_ci//
3a8c51b3fSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4a8c51b3fSopenharmony_ci// you may not use this file except in compliance with the License.
5a8c51b3fSopenharmony_ci// You may obtain a copy of the License at
6a8c51b3fSopenharmony_ci//
7a8c51b3fSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8a8c51b3fSopenharmony_ci//
9a8c51b3fSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10a8c51b3fSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11a8c51b3fSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a8c51b3fSopenharmony_ci// See the License for the specific language governing permissions and
13a8c51b3fSopenharmony_ci// limitations under the License.
14a8c51b3fSopenharmony_ci
15a8c51b3fSopenharmony_ci#include "counter.h"
16a8c51b3fSopenharmony_ci
17a8c51b3fSopenharmony_cinamespace benchmark {
18a8c51b3fSopenharmony_cinamespace internal {
19a8c51b3fSopenharmony_ci
20a8c51b3fSopenharmony_cidouble Finish(Counter const& c, IterationCount iterations, double cpu_time,
21a8c51b3fSopenharmony_ci              double num_threads) {
22a8c51b3fSopenharmony_ci  double v = c.value;
23a8c51b3fSopenharmony_ci  if (c.flags & Counter::kIsRate) {
24a8c51b3fSopenharmony_ci    v /= cpu_time;
25a8c51b3fSopenharmony_ci  }
26a8c51b3fSopenharmony_ci  if (c.flags & Counter::kAvgThreads) {
27a8c51b3fSopenharmony_ci    v /= num_threads;
28a8c51b3fSopenharmony_ci  }
29a8c51b3fSopenharmony_ci  if (c.flags & Counter::kIsIterationInvariant) {
30a8c51b3fSopenharmony_ci    v *= iterations;
31a8c51b3fSopenharmony_ci  }
32a8c51b3fSopenharmony_ci  if (c.flags & Counter::kAvgIterations) {
33a8c51b3fSopenharmony_ci    v /= iterations;
34a8c51b3fSopenharmony_ci  }
35a8c51b3fSopenharmony_ci
36a8c51b3fSopenharmony_ci  if (c.flags & Counter::kInvert) {  // Invert is *always* last.
37a8c51b3fSopenharmony_ci    v = 1.0 / v;
38a8c51b3fSopenharmony_ci  }
39a8c51b3fSopenharmony_ci  return v;
40a8c51b3fSopenharmony_ci}
41a8c51b3fSopenharmony_ci
42a8c51b3fSopenharmony_civoid Finish(UserCounters* l, IterationCount iterations, double cpu_time,
43a8c51b3fSopenharmony_ci            double num_threads) {
44a8c51b3fSopenharmony_ci  for (auto& c : *l) {
45a8c51b3fSopenharmony_ci    c.second.value = Finish(c.second, iterations, cpu_time, num_threads);
46a8c51b3fSopenharmony_ci  }
47a8c51b3fSopenharmony_ci}
48a8c51b3fSopenharmony_ci
49a8c51b3fSopenharmony_civoid Increment(UserCounters* l, UserCounters const& r) {
50a8c51b3fSopenharmony_ci  // add counters present in both or just in *l
51a8c51b3fSopenharmony_ci  for (auto& c : *l) {
52a8c51b3fSopenharmony_ci    auto it = r.find(c.first);
53a8c51b3fSopenharmony_ci    if (it != r.end()) {
54a8c51b3fSopenharmony_ci      c.second.value = c.second + it->second;
55a8c51b3fSopenharmony_ci    }
56a8c51b3fSopenharmony_ci  }
57a8c51b3fSopenharmony_ci  // add counters present in r, but not in *l
58a8c51b3fSopenharmony_ci  for (auto const& tc : r) {
59a8c51b3fSopenharmony_ci    auto it = l->find(tc.first);
60a8c51b3fSopenharmony_ci    if (it == l->end()) {
61a8c51b3fSopenharmony_ci      (*l)[tc.first] = tc.second;
62a8c51b3fSopenharmony_ci    }
63a8c51b3fSopenharmony_ci  }
64a8c51b3fSopenharmony_ci}
65a8c51b3fSopenharmony_ci
66a8c51b3fSopenharmony_cibool SameNames(UserCounters const& l, UserCounters const& r) {
67a8c51b3fSopenharmony_ci  if (&l == &r) return true;
68a8c51b3fSopenharmony_ci  if (l.size() != r.size()) {
69a8c51b3fSopenharmony_ci    return false;
70a8c51b3fSopenharmony_ci  }
71a8c51b3fSopenharmony_ci  for (auto const& c : l) {
72a8c51b3fSopenharmony_ci    if (r.find(c.first) == r.end()) {
73a8c51b3fSopenharmony_ci      return false;
74a8c51b3fSopenharmony_ci    }
75a8c51b3fSopenharmony_ci  }
76a8c51b3fSopenharmony_ci  return true;
77a8c51b3fSopenharmony_ci}
78a8c51b3fSopenharmony_ci
79a8c51b3fSopenharmony_ci}  // end namespace internal
80a8c51b3fSopenharmony_ci}  // end namespace benchmark
81