//===----------------------------------------------------------------------===//
//
// 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
