src/sortlist_type.h
author truebrain
Thu, 12 Jun 2008 19:47:02 +0000
branchnoai
changeset 10942 cd3f2d07199f
parent 10829 8a0ec0f0f928
child 11044 097ea3e7ec56
permissions -rw-r--r--
(svn r13496) [NoAI] -Fix: if a library depends on an other library, the import became globally known, which defeats the idea of imports. They are now restricted to their scope, and 'import' returns the class of import (if any)
10645
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     1
/* $Id$ */
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     2
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     3
/** @file sortlist_type.h Base types for having sorted lists in GUIs. */
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     4
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     5
#ifndef SORTLIST_TYPE_H
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     6
#define SORTLIST_TYPE_H
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
     7
10829
8a0ec0f0f928 (svn r13381) [NoAI] -Sync with trunk r13325:13380
glx
parents: 10776
diff changeset
     8
#include "core/enum_type.hpp"
8a0ec0f0f928 (svn r13381) [NoAI] -Sync with trunk r13325:13380
glx
parents: 10776
diff changeset
     9
#include "core/bitmath_func.hpp"
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    10
#include "misc/smallvec.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    11
#include "date_type.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    12
10645
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    13
enum SortListFlags {
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    14
	VL_NONE       = 0,      ///< no sort
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    15
	VL_DESC       = 1 << 0, ///< sort descending or ascending
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    16
	VL_RESORT     = 1 << 1, ///< instruct the code to resort the list in the next loop
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    17
	VL_REBUILD    = 1 << 2, ///< rebuild the sort list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    18
	VL_FIRST_SORT = 1 << 3, ///< sort with qsort first
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    19
	VL_END        = 1 << 4,
10645
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    20
};
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    21
DECLARE_ENUM_AS_BIT_SET(SortListFlags);
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    22
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    23
struct Listing {
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    24
	bool order;    ///< Ascending/descending
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    25
	byte criteria; ///< Sorting criteria
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    26
};
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    27
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
    28
template <typename T>
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    29
class GUIList : public SmallVector<T, 32> {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    30
public:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    31
	typedef int CDECL SortFunction(const T*, const T*);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    32
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    33
public: // Temporary: public for conversion only
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    34
	SortFunction* const *func_list; ///< The sort criteria functions
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    35
	SortListFlags flags;            ///< used to control sorting/resorting/etc.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    36
	uint8 sort_type;                ///< what criteria to sort on
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    37
	uint16 resort_timer;            ///< resort list after a given amount of ticks if set
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    38
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    39
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    40
	 * Check if the list is sortable
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    41
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    42
	 * @return true if we can sort the list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    43
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    44
	bool IsSortable() const
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    45
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    46
		return (this->data != NULL && this->items >= 2);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    47
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    48
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    49
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    50
	 * Reset the resort timer
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    51
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    52
	void ResetResortTimer()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    53
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    54
		/* Resort every 10 days */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    55
		this->resort_timer = DAY_TICKS * 10;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    56
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    57
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    58
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    59
	 * Reverse the list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    60
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    61
	void Reverse()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    62
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    63
		assert(this->IsSortable());
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    64
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    65
		T *a = this->data;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    66
		T *b = a + (this->items - 1);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    67
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    68
		do {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    69
			Swap(*a, *b);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    70
		} while (++a < --b);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    71
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    72
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    73
public:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    74
	GUIList() :
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    75
		func_list(NULL),
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    76
		flags(VL_FIRST_SORT),
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    77
		sort_type(0),
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    78
		resort_timer(1)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    79
	{};
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    80
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    81
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    82
	 * Get the sorttype of the list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    83
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    84
	 * @return The current sorttype
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    85
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    86
	uint8 SortType() const
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    87
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    88
		return this->sort_type;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    89
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    90
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    91
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    92
	 * Set the sorttype of the list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    93
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    94
	 * @param n_type the new sort type
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    95
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    96
	void SetSortType(uint8 n_type)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    97
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    98
		if (this->sort_type != n_type) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
    99
			SETBITS(this->flags, VL_RESORT | VL_FIRST_SORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   100
			this->sort_type = n_type;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   101
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   102
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   103
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   104
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   105
	 * Export current sort conditions
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   106
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   107
	 * @return the current sort conditions
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   108
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   109
	Listing GetListing() const
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   110
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   111
		Listing l;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   112
		l.order = HASBITS(this->flags, VL_DESC);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   113
		l.criteria = this->sort_type;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   114
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   115
		return l;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   116
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   117
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   118
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   119
	 * Import sort conditions
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   120
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   121
	 * @param l The sport conditions we want to use
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   122
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   123
	void SetListing(Listing l)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   124
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   125
		if (l.order) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   126
			SETBITS(this->flags, VL_DESC);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   127
		} else {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   128
			CLRBITS(this->flags, VL_DESC);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   129
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   130
		this->sort_type = l.criteria;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   131
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   132
		SETBITS(this->flags, VL_FIRST_SORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   133
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   134
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   135
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   136
	 * Check if a resort is needed next loop
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   137
	 *  If used the resort timer will decrease every call
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   138
	 *  till 0. If 0 reached the resort bit will be set and
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   139
	 *  the timer will be reset.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   140
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   141
	 * @return true if resort bit is set for next loop
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   142
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   143
	bool NeedResort()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   144
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   145
		if (--this->resort_timer == 0) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   146
			SETBITS(this->flags, VL_RESORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   147
			this->ResetResortTimer();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   148
			return true;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   149
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   150
		return false;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   151
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   152
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   153
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   154
	 * Force a resort next Sort call
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   155
	 *  Reset the resort timer if used too.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   156
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   157
	void ForceResort()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   158
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   159
		SETBITS(this->flags, VL_RESORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   160
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   161
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   162
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   163
	 * Check if the sort order is descending
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   164
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   165
	 * @return true if the sort order is descending
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   166
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   167
	bool IsDescSortOrder() const
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   168
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   169
		return HASBITS(this->flags, VL_DESC);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   170
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   171
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   172
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   173
	 * Toogle the sort order
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   174
	 *  Since that is the worst condition for the sort function
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   175
	 *  reverse the list here.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   176
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   177
	FORCEINLINE void ToggleSortOrder()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   178
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   179
		this->flags ^= VL_DESC;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   180
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   181
		if (this->IsSortable()) this->Reverse();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   182
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   183
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   184
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   185
	 * GnomeSort algorithm
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   186
	 *  This sorting uses a slightly modifyied Gnome search.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   187
	 *  The basic Gnome search trys to sort already sorted
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   188
	 *  list parts. The modification skips these. For the first
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   189
	 *  sorting we use qsort since it is faster for irregular
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   190
	 *  sorted data.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   191
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   192
	 * @param compare The function to compare two list items
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   193
	 * @return true if the list sequence has been altered
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   194
	 * */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   195
	FORCEINLINE bool Sort(SortFunction *compare)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   196
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   197
		/* Do not sort if the resort bit is not set */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   198
		if (!HASBITS(this->flags, VL_RESORT)) return false;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   199
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   200
		CLRBITS(this->flags, VL_RESORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   201
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   202
		this->ResetResortTimer();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   203
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   204
		/* Do not sort when the list is not sortable */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   205
		if (!this->IsSortable()) return false;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   206
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   207
		const bool desc = HASBITS(this->flags, VL_DESC);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   208
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   209
		if (HASBITS(this->flags, VL_FIRST_SORT)) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   210
			CLRBITS(this->flags, VL_FIRST_SORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   211
			qsort(this->data, this->items, sizeof(T), (int (CDECL *)(const void *, const void *))compare);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   212
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   213
			if (desc) this->Reverse();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   214
			return true;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   215
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   216
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   217
		T *a = this->data;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   218
		T *b = a + 1;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   219
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   220
		uint length = this->items;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   221
		uint offset = 0; // Jump variable
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   222
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   223
		while (length > 1) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   224
			const int diff = compare(a, b);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   225
			if ((!desc && diff <= 0) || (desc && diff >= 0)) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   226
				if (offset != 0) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   227
					/* Jump back to the last direction switch point */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   228
					a += offset;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   229
					b += offset;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   230
					offset = 0;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   231
					continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   232
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   233
				a++;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   234
				b++;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   235
				length--;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   236
			} else {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   237
				Swap(*a, *b);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   238
				if (a != this->data) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   239
					offset++;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   240
					a--;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   241
					b--;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   242
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   243
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   244
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   245
		return true;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   246
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   247
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   248
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   249
	 * Hand the array of sort function pointers to the sort list
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   250
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   251
	 * @param n_funcs The pointer to the first sort func
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   252
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   253
	void SetSortFuncs(SortFunction* const* n_funcs)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   254
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   255
		this->func_list = n_funcs;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   256
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   257
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   258
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   259
	 * Overload of Sort()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   260
	 * Overloaded to reduce external code
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   261
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   262
	 * @return true if the list sequence has been altered
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   263
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   264
	bool Sort()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   265
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   266
		assert(this->func_list != NULL);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   267
		return this->Sort(this->func_list[this->sort_type]);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   268
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   269
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   270
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   271
	 * Check if a rebuild is needed
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   272
	 * @return true if a rebuild is needed
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   273
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   274
	bool NeedRebuild() const
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   275
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   276
		return HASBITS(this->flags, VL_REBUILD);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   277
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   278
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   279
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   280
	 * Force that a rebuild is needed
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   281
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   282
	void ForceRebuild()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   283
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   284
		SETBITS(this->flags, VL_REBUILD);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   285
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   286
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   287
	/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   288
	 * Notify the sortlist that the rebuild is done
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   289
	 *
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   290
	 * @note This forces a resort
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   291
	 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   292
	void RebuildDone()
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   293
	{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   294
		CLRBITS(this->flags, VL_REBUILD);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   295
		SETBITS(this->flags, VL_RESORT);
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10645
diff changeset
   296
	}
10645
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
   297
};
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
   298
8cbdb511a674 (svn r13189) [NoAI] -Sync: with trunk r13055:13185.
glx
parents:
diff changeset
   299
#endif /* SORTLIST_TYPE_H */