//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef CHECK_CONSECUTIVE_H
#define CHECK_CONSECUTIVE_H

// <unordered_multiset>
// <unordered_multimap>

#include <cassert>
#include <set>
#include <stddef.h>

// Check consecutive equal values in an unordered_multiset iterator
template <typename Iter>
void CheckConsecutiveValues(Iter pos, Iter end, typename Iter::value_type value, size_t count)
{
    for ( size_t i = 0; i < count; ++i )
    {
        assert(pos != end);
        assert(*pos == value);
        ++pos;
    }
    assert(pos == end || *pos != value);
}

// Check consecutive equal keys in an unordered_multimap iterator
template <typename Iter>
void CheckConsecutiveKeys(Iter pos, Iter end, typename Iter::value_type::first_type key, std::multiset<typename Iter::value_type::second_type>& values)
{
    while (!values.empty())
    {
        assert(pos != end);
        assert(pos->first == key);
        assert(values.find(pos->second) != values.end());
        values.erase(values.find(pos->second));
        ++pos;
    }
    assert(pos == end || pos->first != key);
}

#endif
