blob: a241f3c686fa4d8d064db6dd29879179acfe434e [file] [log] [blame]
// Copyright 2019 the V8 project 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 V8_OBJECTS_INTERNAL_INDEX_H_
#define V8_OBJECTS_INTERNAL_INDEX_H_
#include <stdint.h>
#include <limits>
#include "src/base/logging.h"
namespace v8 {
namespace internal {
// Simple wrapper around an entry (which is notably different from "index" for
// dictionary backing stores). Most code should treat this as an opaque
// wrapper: get it via GetEntryForIndex, pass it on to consumers.
class InternalIndex {
public:
explicit constexpr InternalIndex(size_t raw) : entry_(raw) {}
static InternalIndex NotFound() { return InternalIndex(kNotFound); }
V8_WARN_UNUSED_RESULT InternalIndex adjust_down(size_t subtract) const {
DCHECK_GE(entry_, subtract);
return InternalIndex(entry_ - subtract);
}
V8_WARN_UNUSED_RESULT InternalIndex adjust_up(size_t add) const {
DCHECK_LT(entry_, std::numeric_limits<size_t>::max() - add);
return InternalIndex(entry_ + add);
}
bool is_found() const { return entry_ != kNotFound; }
bool is_not_found() const { return entry_ == kNotFound; }
size_t raw_value() const { return entry_; }
uint32_t as_uint32() const {
DCHECK_LE(entry_, std::numeric_limits<uint32_t>::max());
return static_cast<uint32_t>(entry_);
}
constexpr int as_int() const {
CONSTEXPR_DCHECK(entry_ <=
static_cast<size_t>(std::numeric_limits<int>::max()));
return static_cast<int>(entry_);
}
bool operator==(const InternalIndex& other) const {
return entry_ == other.entry_;
}
// Iteration support.
InternalIndex operator*() { return *this; }
bool operator!=(const InternalIndex& other) const {
return entry_ != other.entry_;
}
InternalIndex& operator++() {
entry_++;
return *this;
}
class Range {
public:
explicit Range(size_t max) : min_(0), max_(max) {}
Range(size_t min, size_t max) : min_(min), max_(max) {}
InternalIndex begin() { return InternalIndex(min_); }
InternalIndex end() { return InternalIndex(max_); }
private:
size_t min_;
size_t max_;
};
private:
static const size_t kNotFound = std::numeric_limits<size_t>::max();
size_t entry_;
};
} // namespace internal
} // namespace v8
#endif // V8_OBJECTS_INTERNAL_INDEX_H_