File: ObjectBounds2D.cpp

package info (click to toggle)
ausaxs 1.1.8-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 72,592 kB
  • sloc: cpp: 49,853; ansic: 6,901; python: 730; makefile: 18
file content (50 lines) | stat: -rw-r--r-- 2,371 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// SPDX-License-Identifier: LGPL-3.0-or-later
// Author: Kristian Lytje

#include <em/ObjectBounds2D.h>
#include <utility/Limit.h>

#include <numeric>
#include <utility/Exceptions.h>

using namespace ausaxs::em;

ObjectBounds2D::ObjectBounds2D(unsigned int size_x, unsigned int size_y) : bounds(size_x, Limit(0, size_y)), N(size_x), M(size_y) {}

ObjectBounds2D::~ObjectBounds2D() = default;

void ObjectBounds2D::set_bounds(unsigned int x, const Limit& limit) {
    if (x >= N) {throw except::out_of_bounds("ObjectBounds2D::set_bounds: index " + std::to_string(x) + " is out of range (" + std::to_string(N) + ")");}
    if (limit.max > M) {throw except::out_of_bounds("ObjectBounds2D::set_bounds: limit " + std::to_string(limit.max) + " is out of bounds (" + std::to_string(M) + ")");}
    bounds[x] = limit;
}

void ObjectBounds2D::set_bounds(unsigned int x, unsigned int min, unsigned int max) {
    set_bounds(x, Limit(min, max));
}

void ObjectBounds2D::set_min(unsigned int x, unsigned int min) {
    if (x >= N) {throw except::out_of_bounds("ObjectBounds2D::set_min: index " + std::to_string(x) + " is out of range (" + std::to_string(N) + ")");}
    if (min > M) {throw except::out_of_bounds("ObjectBounds2D::set_min: limit " + std::to_string(min) + " is out of bounds (" + std::to_string(M) + ")");}
    bounds[x].min = min;
}

void ObjectBounds2D::set_max(unsigned int x, unsigned int max) {
    if (x >= N) {throw except::out_of_bounds("ObjectBounds2D::set_max: index " + std::to_string(x) + " is out of range (" + std::to_string(N) + ")");}
    if (max > M) {throw except::out_of_bounds("ObjectBounds2D::set_max: limit " + std::to_string(max) + " is out of bounds (" + std::to_string(M) + ")");}
    bounds[x].max = max;
}

const ausaxs::Limit& ObjectBounds2D::operator[](unsigned int x) const {return bounds[x];}

unsigned int ObjectBounds2D::size_x() const {return N;}

unsigned int ObjectBounds2D::size_y() const {return M;}

bool ObjectBounds2D::empty() const {return bounded_area() == N;}

unsigned int ObjectBounds2D::bounded_area() const {return std::accumulate(bounds.begin(), bounds.end(), 0u, [] (unsigned int area, const Limit& limit) {return area += static_cast<unsigned int>(limit.max+1 - limit.min);});}

unsigned int ObjectBounds2D::total_area() const {return N*M;}

bool ObjectBounds2D::operator==(const ObjectBounds2D& other) const = default;