11 #define assert_no_abort(expr) ((void)0) 13 #define assert_no_abort(expr) ((void)((expr) || (__assert_no_abort(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__), 0))) 14 template <
typename T =
void>
17 edm::LogWarning(
"L1T") << file <<
":" << line <<
": " <<
function <<
": Assertion `" << assertion
18 <<
"' failed. (no abort)";
25 template <
typename INT>
28 s <<
"0x" << std::hex <<
i;
33 template <
typename INT>
38 s <<
"0b" << b.to_string().substr(32 - n, 32);
39 }
else if (
sizeof(i) <= 8) {
41 s <<
"0b" << b.to_string().substr(64 - n, 64);
47 template <
typename T,
size_t N>
53 template <
typename T,
size_t N>
57 for (
size_t i = 0; i <
N; ++
i) {
74 _reversed(
T& _t) :
t(_t) {}
75 decltype(t.rbegin())
begin() {
return t.rbegin(); }
76 decltype(t.rend())
end() {
return t.rend(); }
80 details::_reversed<T> reversed(
T&
t) {
81 return details::_reversed<T>(
t);
86 template <
class STR = std::
string>
87 std::vector<STR> split_string(
const std::string&
s,
char c =
' ',
char d =
' ') {
89 const char*
str = s.c_str();
92 while (*str !=
c && *str !=
d && *str)
94 result.emplace_back(begin, str);
95 }
while (0 != *str++);
101 template <
class T1,
class T2>
102 void flatten_container(
const T1&
input, T2&
output) {
103 typename T1::const_iterator it;
104 for (it = input.begin(); it != input.end(); ++it) {
105 output.insert(output.end(), it->begin(), it->end());
111 struct is_map_of_vectors :
public std::false_type {};
113 template <
typename T1,
typename T2>
114 struct is_map_of_vectors<std::
map<T1, std::vector<T2> > > :
public std::true_type {};
117 template <
typename Map>
118 void merge_map_into_map(
const Map& map1, Map& map2) {
120 typedef typename Map::iterator
Iterator;
121 typedef typename Map::mapped_type
Container;
123 for (
auto& kv1 : map1) {
124 std::pair<Iterator, bool>
ins = map2.insert(kv1);
127 const Container* container1 = &(kv1.second);
128 Container* container2 = &(ins.first->second);
129 container2->insert(container2->end(), container1->begin(), container1->end());
139 template <
class ForwardIt,
class BinaryPredicate,
class BinaryOp>
140 ForwardIt adjacent_cluster(ForwardIt
first, ForwardIt
last, BinaryPredicate adjacent, BinaryOp cluster) {
145 while (++first != last) {
146 if (!adjacent(*result, *first)) {
149 cluster(*result, *first);
157 template <
typename RandomAccessIterator,
typename Compare = std::less<> >
158 void merge_sort_merge(RandomAccessIterator first,
159 RandomAccessIterator middle,
160 RandomAccessIterator last,
164 typedef typename std::iterator_traits<RandomAccessIterator>::pointer pointer;
165 std::pair<pointer, std::ptrdiff_t>
p = std::get_temporary_buffer<value_type>(len);
166 pointer buf = p.first;
167 pointer buf_end =
std::next(p.first, p.second);
169 RandomAccessIterator first1 =
first;
170 RandomAccessIterator last1 = middle;
171 RandomAccessIterator first2 = middle;
172 RandomAccessIterator last2 =
last;
174 while (first1 != last1 && first2 != last2) {
175 if (
cmp(*first2, *first1)) {
181 while (first1 != last1) {
184 while (first2 != last2) {
190 std::return_temporary_buffer(p.first);
194 template <
typename RandomAccessIterator,
typename Compare = std::less<> >
195 void merge_sort(RandomAccessIterator first, RandomAccessIterator last, Compare cmp) {
198 RandomAccessIterator middle =
std::next(first, len / 2);
199 merge_sort(first, middle, cmp);
200 merge_sort(middle, last, cmp);
201 merge_sort_merge(first, middle, last, cmp);
208 template <
typename RandomAccessIterator,
typename Compare,
typename Compare3>
209 void merge_sort_merge3(RandomAccessIterator first,
210 RandomAccessIterator one_third,
211 RandomAccessIterator two_third,
212 RandomAccessIterator last,
217 typedef typename std::iterator_traits<RandomAccessIterator>::pointer pointer;
218 std::pair<pointer, std::ptrdiff_t>
p = std::get_temporary_buffer<value_type>(len);
219 pointer buf = p.first;
220 pointer buf_end =
std::next(p.first, p.second);
222 RandomAccessIterator first1 =
first;
223 RandomAccessIterator last1 = one_third;
224 RandomAccessIterator first2 = one_third;
225 RandomAccessIterator last2 = two_third;
226 RandomAccessIterator first3 = two_third;
227 RandomAccessIterator last3 =
last;
229 while (first1 != last1 && first2 != last2 && first3 != last3) {
230 int rr = cmp3(*first1, *first2, *first3);
233 }
else if (rr == 1) {
235 }
else if (rr == 2) {
240 if (first3 == last3) {
242 }
else if (first2 == last2) {
245 }
else if (first1 == last1) {
252 while (first1 != last1 && first2 != last2) {
253 if (
cmp(*first2, *first1)) {
259 while (first1 != last1) {
262 while (first2 != last2) {
268 std::return_temporary_buffer(p.first);
272 template <
typename RandomAccessIterator,
typename Compare,
typename Compare3>
273 void merge_sort3(RandomAccessIterator first, RandomAccessIterator last, Compare cmp, Compare3 cmp3) {
276 RandomAccessIterator one_third =
std::next(first, (len + 2) / 3);
277 RandomAccessIterator two_third =
std::next(first, (len + 2) / 3 * 2);
278 merge_sort3(first, one_third, cmp, cmp3);
279 merge_sort3(one_third, two_third, cmp, cmp3);
280 merge_sort3(two_third, last, cmp, cmp3);
281 merge_sort_merge3(first, one_third, two_third, last, cmp, cmp3);
286 template <
typename RandomAccessIterator,
typename Compare,
typename Compare3>
287 void merge_sort3_with_hint(
288 RandomAccessIterator first, RandomAccessIterator last, Compare cmp, Compare3 cmp3, std::ptrdiff_t
d) {
291 RandomAccessIterator one_third =
std::next(first, d);
292 RandomAccessIterator two_third =
std::next(first, d * 2);
293 merge_sort3(first, one_third, cmp, cmp3);
294 merge_sort3(one_third, two_third, cmp, cmp3);
295 merge_sort3(two_third, last, cmp, cmp3);
296 merge_sort_merge3(first, one_third, two_third, last, cmp, cmp3);
static char to_hex(unsigned int i)
static std::string const input
Container::value_type value_type
edm::AssociationVector< reco::JetRefBaseProd, Values > Container
void __assert_no_abort(const char *assertion, const char *file, unsigned int line, const char *function)