/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "intcnt.h" IntCount::IntCount() : numInts(0), iPair(nullptr) {} IntCount::~IntCount() { delete[] iPair; } int IntCount::getSize() { return numInts; } int IntCount::getCount(int pos) { return iPair[pos].cnt; } int IntCount::getIndex(int pos) { return iPair[pos].idx; } void IntCount::clear() { delete[] iPair; iPair = new IntPair[0]; numInts = 0; } int IntCount::countAdd(int index, int increment) { if (numInts) { // Do a binary search to find the element int divPoint = 0; if (index > iPair[numInts - 1].idx) { divPoint = numInts; } else if (index < iPair[0].idx) { divPoint = 0; } else { int low = 0, high = numInts - 1; int mid = (low + high) / 2; while (1) { mid = (low + high) / 2; if (index < iPair[mid].idx) { high = mid; } else if (index > iPair[mid].idx) { if (mid < numInts - 1 && index < iPair[mid + 1].idx) { divPoint = mid + 1; break; } else { low = mid + 1; } } else if (index == iPair[mid].idx) { return iPair[mid].cnt += increment; } } } int i; IntPair* tpair = new IntPair[numInts + 1]; for (i = 0; i < divPoint; i++) { tpair[i] = iPair[i]; } for (i = divPoint; i < numInts; i++) { tpair[i + 1] = iPair[i]; } ++numInts; delete[] iPair; iPair = tpair; iPair[divPoint].idx = index; iPair[divPoint].cnt = increment; return increment; } else { iPair = new IntPair[1]; numInts = 1; iPair[0].idx = index; return iPair[0].cnt = increment; } }