blob: f066416ca3550ad077e393e42dd0fe5cc13936c7 [file] [log] [blame]
//===--- ValueEnumerator.h --- Enumerates values ----------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_BASIC_VALUEENUMERATOR_H
#define SWIFT_BASIC_VALUEENUMERATOR_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/raw_ostream.h"
namespace swift {
/// / This class maps values to unique indices.
template<class ValueTy, class IndexTy = size_t>
class ValueEnumerator {
/// A running counter to enumerate values.
IndexTy counter = 0;
/// Maps values to unique integers.
llvm::DenseMap<ValueTy, IndexTy> ValueToIndex;
public:
/// Return the index of value \p v.
IndexTy getIndex(const ValueTy &v) {
// Return the index of this Key, if we've assigned one already.
auto It = ValueToIndex.find(v);
if (It != ValueToIndex.end()) {
return It->second;
}
// Generate a new counter for the key.
ValueToIndex[v] = ++counter;
return counter;
}
ValueEnumerator() = default;
/// Forget about key \p v.
void invalidateValue(const ValueTy &v) { ValueToIndex.erase(v); }
/// Clear the enumeration state of the
void clear() {
ValueToIndex.clear();
counter = 0;
}
};
} // end namespace swift
#endif // SWIFT_BASIC_VALUEENUMERATOR_H