]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/build/src/util/sequence.py
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / tools / build / src / util / sequence.py
1 # (C) Copyright David Abrahams 2002. Permission to copy, use, modify, sell and
2 # distribute this software is granted provided this copyright notice appears in
3 # all copies. This software is provided "as is" without express or implied
4 # warranty, and with no claim as to its suitability for any purpose.
5
6 import operator
7
8 from b2.util import is_iterable
9
10
11 def unique (values, stable=False):
12 assert is_iterable(values)
13 if stable:
14 s = set()
15 r = []
16 for v in values:
17 if not v in s:
18 r.append(v)
19 s.add(v)
20 return r
21 else:
22 return list(set(values))
23
24 def max_element (elements, ordered = None):
25 """ Returns the maximum number in 'elements'. Uses 'ordered' for comparisons,
26 or '<' is none is provided.
27 """
28 assert is_iterable(elements)
29 assert callable(ordered) or ordered is None
30 if not ordered: ordered = operator.lt
31
32 max = elements [0]
33 for e in elements [1:]:
34 if ordered (max, e):
35 max = e
36
37 return max
38
39 def select_highest_ranked (elements, ranks):
40 """ Returns all of 'elements' for which corresponding element in parallel
41 list 'rank' is equal to the maximum value in 'rank'.
42 """
43 assert is_iterable(elements)
44 assert is_iterable(ranks)
45 if not elements:
46 return []
47
48 max_rank = max_element (ranks)
49
50 result = []
51 while elements:
52 if ranks [0] == max_rank:
53 result.append (elements [0])
54
55 elements = elements [1:]
56 ranks = ranks [1:]
57
58 return result