blob: 0acee732492ba80fda0f9fba548a6448d237978a (
plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
// -*- C++ -*-
//=============================================================================
/**
* @file Combination_T.h
*
* $Id$
*
* 2003 - 2006 Wong Shao Voon
* No warranty, implied or expressed, is included.
* Author is not liable for any type of loss through
* the use of this source code. Use it at your own risk!
*/
//=============================================================================
#ifndef COMBINATION_T_H_
#define COMBINATION_T_H_
#include <algorithm>
template <class ITERATOR>
inline bool
next_combination (ITERATOR base_begin,
ITERATOR base_end,
ITERATOR comb_begin,
ITERATOR comb_end)
{
bool marked = false;
ITERATOR comb_mark;
ITERATOR base_it = base_end;
--base_it;
ITERATOR temp_comb_end = comb_end;
--temp_comb_end;
for (ITERATOR it = temp_comb_end;
it != comb_begin || it == comb_begin;
--it, --base_it)
{
if (*it == *base_it)
{
if (it != comb_begin)
{
marked = true;
comb_mark = (--it);
++it;
continue;
}
else
{
return false;
}
}
else if (*it != *base_it)
{
if (marked == true)
{
ITERATOR base_mark;
for (ITERATOR base_it2=base_begin;
base_it2 != base_end; ++base_it2)
{
if (*comb_mark == *base_it2)
{
base_mark = base_it2;
break;
}
}
ITERATOR kt = ++base_mark;
for (ITERATOR lt = comb_mark; lt != comb_end; ++lt, ++kt)
{
*lt = *kt;
}
return true;
}
for (ITERATOR jt = base_begin; jt != base_end; ++jt)
{
if (*it == *jt)
{
*it = *(++jt);
return true;
}
}
}
}
return false;
}
#endif /* COMBINATION_T_H_ */
|