blob: 012b4b569da711ae92f566faa3249592035d409a [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FIDES_IDENTIFIER_UTILS_H_
#define FIDES_IDENTIFIER_UTILS_H_
#include <map>
#include <set>
#include <string>
#include "fides/key.h"
namespace fides {
namespace utils {
// A range adaptor for a pair of iterators.
template <class Iter>
class Range {
public:
Range(Iter begin, Iter end) : begin_(begin), end_(end) {}
Iter begin() const { return begin_; }
Iter end() const { return end_; }
private:
const Iter begin_;
const Iter end_;
};
// Convenience function for creating a Range.
template <class Iter>
Range<Iter> make_range(Iter begin, Iter end) {
return Range<Iter>(begin, end);
}
// Returns a range of identifiers defined in |container| that are either equal
// to |key| or have |key| as their ancestor. If |key| is the empty string,
// returns the full range of the |container|. If |key| is not a valid key,
// returns the empty range.
template <class T>
Range<typename T::const_iterator> GetRange(const Key& key, const T& container) {
// For the root key, always return the whole range.
if (key.IsRootKey())
return make_range(container.begin(), container.end());
return make_range(container.lower_bound(key),
container.lower_bound(key.PrefixUpperBound()));
}
// Checks whether |container| has any keys which are equal to or have |key| as
// an ancestor.
template <class T>
bool HasKeys(const Key& key, const T& container) {
auto range = GetRange(key, container);
return range.begin() != range.end();
}
} // namespace utils
} // namespace fides
#endif // FIDES_IDENTIFIER_UTILS_H_