summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Combination_T.h
blob: e90395b0e34769af7e998057fd31ad141d04fbf0 (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)
            {
              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_ */