Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Range.h"
- Range::Range() : rangeFirst(0), rangeLength(0), valueCounts(nullptr) {}
- void Range::add(T value){
- if(this->empty()){
- resize(value, value);
- add(value);
- } else
- if((value >= rangeFirst) && (value < (rangeFirst + rangeLength))) {
- ++valueCounts[getIndex(value)];
- }else
- if(value >= (rangeFirst + rangeLength)){
- resize(rangeFirst, value);
- add(value);
- }else
- if(value < rangeFirst){
- resize(value, rangeFirst + rangeLength - 1);
- add(value);
- }
- }
- size_t Range::getCount(T value) const{
- if((getIndex(value) < rangeLength) && (getIndex(value) >= 0)){
- return valueCounts[getIndex(value)];
- }else return 0;
- }
- void Range::clear(){
- rangeFirst = 0;
- rangeLength = 0;
- if(valueCounts){
- delete[] valueCounts;
- }
- }
- void Range::resize(T first, T last){
- size_t * valuesTemp = new size_t[last - first + 1]();
- if(first < rangeFirst){
- T offset = rangeFirst - first;
- for(size_t i = 0; i != rangeLength; ++i){
- valuesTemp[i + offset] = valueCounts[i];
- }
- } else
- if(last >= rangeFirst + rangeLength){
- for(size_t i = 0; i != rangeLength; ++i){
- valuesTemp[i] = valueCounts[i];
- }
- }
- clear();
- rangeFirst = first;
- rangeLength = last - first + 1;
- valueCounts = valuesTemp;
- }
- bool Range::empty() const{
- return !rangeLength;
- }
- Range::Range(const Range& other) : rangeFirst(other.rangeFirst), rangeLength(other.rangeLength), valueCounts(nullptr) {
- if(other.valueCounts){
- valueCounts = Range::copyValues(other);
- }
- }
- Range& Range::operator=(const Range& other){
- if(this != &other){
- if(other.valueCounts){
- clear();
- rangeFirst = other.rangeFirst;
- rangeLength = other.rangeLength;
- valueCounts = Range::copyValues(other);
- }
- }
- return *this;
- }
- Range::~Range(){
- clear();
- }
- size_t Range::getIndex(T value) const{
- return value - rangeFirst;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement