Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
BlobSizeRange.cpp 1.75 KiB
#include "BlobSizeRange.h"

namespace cmn {

BlobSizeRange BlobSizeRange::fromStr(const std::string &str) {
    if (str[0] == '[' && str[1] != '[') {
        return BlobSizeRange({Meta::fromStr<Rangef>(str)});
    }
    return BlobSizeRange(Meta::fromStr<std::vector<Rangef>>(str));
}

BlobSizeRange::BlobSizeRange(const std::vector<Rangef>& ranges)
    : _max_range(-1, -1)
{
    for (auto &range : ranges)
        add(range);
}

BlobSizeRange::operator MetaObject() const {
    return MetaObject(Meta::toStr(_ranges), "BlobSizeRange");
}

void BlobSizeRange::add(const Rangef &range) {
    _ranges.insert(range);
    if(_max_range.start == -1 || range.start < _max_range.start)
        _max_range.start = range.start;
    if(_max_range.end == -1 || range.end > _max_range.end)
        _max_range.end = range.end;
}

bool BlobSizeRange::close_to_minimum_of_one(float cmsq, float scale_factor) const {
    for(auto & range : _ranges) {
        if(cmsq >= range.start * scale_factor)
            return true;
    }
    return false;
}

bool BlobSizeRange::close_to_maximum_of_one(float cmsq, float scale_factor) const {
    for(auto & range : _ranges) {
        if(cmsq <= range.end * scale_factor)
            return true;
    }
    return false;
}

bool BlobSizeRange::in_range_of_one(float cmsq, float scale_factor, float scale_factor_r) const {
    assert(scale_factor == -1 || (scale_factor > 0 && scale_factor < 2));
    if(scale_factor_r == -1)
        scale_factor_r = 2 - abs(scale_factor);
    
    for(auto & range : _ranges) {
        if((scale_factor == -1 && range.contains(cmsq))
           || (scale_factor != -1 && Rangef(range.start * scale_factor, range.end * scale_factor_r).contains(cmsq)))
        {
            return true;
        }
    }
    
    return false;
}

}