1c44cd1e4SLouis Dionne //===----------------------------------------------------------------------===//
2c44cd1e4SLouis Dionne //
3c44cd1e4SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c44cd1e4SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5c44cd1e4SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c44cd1e4SLouis Dionne //
7c44cd1e4SLouis Dionne //===----------------------------------------------------------------------===//
8480cd780SLouis Dionne
9c44cd1e4SLouis Dionne #ifndef CHECK_CONSECUTIVE_H
10c44cd1e4SLouis Dionne #define CHECK_CONSECUTIVE_H
11c44cd1e4SLouis Dionne
12c44cd1e4SLouis Dionne // <unordered_multiset>
13c44cd1e4SLouis Dionne // <unordered_multimap>
14c44cd1e4SLouis Dionne
15c44cd1e4SLouis Dionne #include <cassert>
16c44cd1e4SLouis Dionne #include <set>
17c44cd1e4SLouis Dionne #include <stddef.h>
18c44cd1e4SLouis Dionne
19c44cd1e4SLouis Dionne // Check consecutive equal values in an unordered_multiset iterator
20c44cd1e4SLouis Dionne template <typename Iter>
CheckConsecutiveValues(Iter pos,Iter end,typename Iter::value_type value,std::size_t count)21*fb855eb9SMark de Wever void CheckConsecutiveValues(Iter pos, Iter end, typename Iter::value_type value, std::size_t count)
22c44cd1e4SLouis Dionne {
23*fb855eb9SMark de Wever for ( std::size_t i = 0; i < count; ++i )
24c44cd1e4SLouis Dionne {
25c44cd1e4SLouis Dionne assert(pos != end);
26c44cd1e4SLouis Dionne assert(*pos == value);
27c44cd1e4SLouis Dionne ++pos;
28c44cd1e4SLouis Dionne }
29c44cd1e4SLouis Dionne assert(pos == end || *pos != value);
30c44cd1e4SLouis Dionne }
31c44cd1e4SLouis Dionne
32c44cd1e4SLouis Dionne // Check consecutive equal keys in an unordered_multimap iterator
33c44cd1e4SLouis Dionne template <typename Iter>
CheckConsecutiveKeys(Iter pos,Iter end,typename Iter::value_type::first_type key,std::multiset<typename Iter::value_type::second_type> & values)34c44cd1e4SLouis Dionne void CheckConsecutiveKeys(Iter pos, Iter end, typename Iter::value_type::first_type key, std::multiset<typename Iter::value_type::second_type>& values)
35c44cd1e4SLouis Dionne {
36c44cd1e4SLouis Dionne while (!values.empty())
37c44cd1e4SLouis Dionne {
38c44cd1e4SLouis Dionne assert(pos != end);
39c44cd1e4SLouis Dionne assert(pos->first == key);
40c44cd1e4SLouis Dionne assert(values.find(pos->second) != values.end());
41c44cd1e4SLouis Dionne values.erase(values.find(pos->second));
42c44cd1e4SLouis Dionne ++pos;
43c44cd1e4SLouis Dionne }
44c44cd1e4SLouis Dionne assert(pos == end || pos->first != key);
45c44cd1e4SLouis Dionne }
46c44cd1e4SLouis Dionne
47c44cd1e4SLouis Dionne #endif
48