#pragma once
/*
 * Copyright 2010-2016 OpenXcom Developers.
 *
 * This file is part of OpenXcom.
 *
 * OpenXcom is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * OpenXcom is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with OpenXcom.  If not, see <http://www.gnu.org/licenses/>.
 */
 
#ifndef OPENXCOM_GRAPHSUBSET_H
#define	OPENXCOM_GRAPHSUBSET_H
 
#include <utility>
#include <algorithm>
 
namespace OpenXcom
{
 
 
 
struct GraphSubset
{
 
	//define part of surface
	int beg_x, end_x;
	int beg_y, end_y;
 
	GraphSubset(int max_x, int max_y):
			beg_x(0), end_x(max_x),
			beg_y(0), end_y(max_y)
	{
 
	}
 
 
	GraphSubset(std::pair<int, int> range_x, std::pair<int, int> range_y):
			beg_x(range_x.first), end_x(range_x.second),
			beg_y(range_y.first), end_y(range_y.second)
	{
 
	}
 
	GraphSubset(const GraphSubset& r):
			beg_x(r.beg_x), end_x(r.end_x),
			beg_y(r.beg_y), end_y(r.end_y)
	{
 
	}
 
	inline GraphSubset offset(int x, int y) const
	{
		GraphSubset ret = *this;
		ret.beg_x += x;
		ret.end_x += x;
		ret.beg_y += y;
		ret.end_y += y;
		return ret;
	}
 
	inline int size_x() const
	{
		return end_x - beg_x;
	}
 
	inline int size_y() const
	{
		return end_y - beg_y;
	}
 
 
	static inline void intersection_range(int& begin_a, int& end_a, const int& begin_b, const int& end_b)
	{
		if (begin_a >= end_b || begin_b >= end_a)
		{
			//intersection is empty
			end_a = begin_a;
		}
		else
		{
			begin_a = std::max(begin_a, begin_b);
			end_a = std::min(end_a, end_b);
		}
	}
	static inline GraphSubset intersection(const GraphSubset& a, const GraphSubset& b)
	{
		GraphSubset ret = a;
		intersection_range(ret.beg_x, ret.end_x, b.beg_x, b.end_x);
		intersection_range(ret.beg_y, ret.end_y, b.beg_y, b.end_y);
		return ret;
	}
	static inline GraphSubset intersection(const GraphSubset& a, const GraphSubset& b,  const GraphSubset& c)
	{
		GraphSubset ret =  intersection(a, b);
		intersection_range(ret.beg_x, ret.end_x, c.beg_x, c.end_x);
		intersection_range(ret.beg_y, ret.end_y, c.beg_y, c.end_y);
		return ret;
	}
	static inline GraphSubset intersection(const GraphSubset& a, const GraphSubset& b,  const GraphSubset& c, const GraphSubset& d)
	{
		GraphSubset ret =  intersection(a, b, c);
		intersection_range(ret.beg_x, ret.end_x, d.beg_x, d.end_x);
		intersection_range(ret.beg_y, ret.end_y, d.beg_y, d.end_y);
		return ret;
	}
 
};
 
}//namespace OpenXcom
 
#endif	/* OPENXCOM_GRAPHSUBSET_H */
 

V690 The 'GraphSubset' class implements a copy constructor, but lacks the copy assignment operator. It is dangerous to use such a class.