File: gridallocation.h

package info (click to toggle)
warzone2100 4.6.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 660,320 kB
  • sloc: cpp: 676,209; ansic: 391,201; javascript: 78,238; python: 16,632; php: 4,294; sh: 4,094; makefile: 2,629; lisp: 1,492; cs: 489; xml: 404; perl: 224; ruby: 156; java: 89
file content (71 lines) | stat: -rw-r--r-- 2,138 bytes parent folder | download | duplicates (3)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
	This file is part of Warzone 2100.
	Copyright (C) 2021  Warzone 2100 Project

	Warzone 2100 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 2 of the License, or
	(at your option) any later version.

	Warzone 2100 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 Warzone 2100; if not, write to the Free Software
	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#ifndef __INCLUDED_LIB_WIDGET_GRIDALLOCATION_H__
#define __INCLUDED_LIB_WIDGET_GRIDALLOCATION_H__

#include <map>
#include <set>
#include <vector>

namespace grid_allocation
{
	struct slot
	{
		slot(uint32_t start = 0, uint32_t span = 1, bool expandable = true);
		uint32_t start;
		uint32_t span;
		bool expandable;
	};

	struct item
	{
		grid_allocation::slot slot;
		int32_t ideal_size;

		uint32_t start() const;
		uint32_t end() const;
		uint32_t span() const;
		bool expandable() const;
	};

	class allocator
	{
	public:
		allocator(const std::vector<item> &items);
		std::map<uint32_t, int32_t> calculate_offsets(int32_t available_space);
		int get_minimum_size();

	private:
		void initialize_steps(const std::vector<grid_allocation::item> &items);
		std::vector<item> normalize_items(const std::vector<grid_allocation::item> &items);
		void initialize_expandable_map(const std::vector<item>& items);
		void initialize_base_sizes(const std::vector<item>& items);
		void expand(std::vector<int32_t>& sizes, int32_t space, size_t start, size_t end);
		void shrink(std::vector<int32_t>& sizes, int32_t space, size_t start, size_t end);

		size_t slots_size;
		std::map<uint32_t, uint32_t> steps_index;
		std::vector<uint32_t> steps;
		std::vector<int32_t> base_sizes;
		std::vector<bool> expandable_map;
	};
}

#endif // __INCLUDED_LIB_WIDGET_GRIDALLOCATION_H__