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