2017-07-03 22:41:10 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
namespace utils {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determines whether the value of bound expression should be included or
|
|
|
|
* excluded.
|
|
|
|
*/
|
|
|
|
enum class BoundType { INCLUSIVE, EXCLUSIVE };
|
|
|
|
|
|
|
|
/** Defines a bounding value for a range. */
|
|
|
|
template <typename TValue>
|
|
|
|
class Bound {
|
|
|
|
public:
|
|
|
|
using Type = BoundType;
|
|
|
|
|
|
|
|
Bound(TValue value, Type type) : value_(value), type_(type) {}
|
|
|
|
|
|
|
|
Bound(const Bound &other) = default;
|
|
|
|
Bound(Bound &&other) = default;
|
|
|
|
|
|
|
|
Bound &operator=(const Bound &other) = default;
|
|
|
|
Bound &operator=(Bound &&other) = default;
|
|
|
|
|
|
|
|
/** Value for the bound. */
|
|
|
|
const auto &value() const { return value_; }
|
|
|
|
/** Whether the bound is inclusive or exclusive. */
|
|
|
|
auto type() const { return type_; }
|
2017-07-05 22:00:07 +08:00
|
|
|
auto IsInclusive() const { return type_ == BoundType::INCLUSIVE; }
|
|
|
|
auto IsExclusive() const { return type_ == BoundType::EXCLUSIVE; }
|
2017-07-03 22:41:10 +08:00
|
|
|
|
|
|
|
private:
|
|
|
|
TValue value_;
|
|
|
|
Type type_;
|
|
|
|
};
|
|
|
|
|
2017-07-05 22:00:07 +08:00
|
|
|
/**
|
|
|
|
* Creates an inclusive @c Bound.
|
|
|
|
*
|
|
|
|
* @param value - Bound value
|
|
|
|
* @tparam TValue - value type
|
|
|
|
*/
|
|
|
|
template <typename TValue>
|
|
|
|
Bound<TValue> MakeBoundInclusive(TValue value) {
|
|
|
|
return Bound<TValue>(value, BoundType::INCLUSIVE);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an exclusive @c Bound.
|
|
|
|
*
|
|
|
|
* @param value - Bound value
|
|
|
|
* @tparam TValue - value type
|
|
|
|
*/
|
|
|
|
template <typename TValue>
|
|
|
|
Bound<TValue> MakeBoundExclusive(TValue value) {
|
|
|
|
return Bound<TValue>(value, BoundType::EXCLUSIVE);
|
|
|
|
};
|
|
|
|
|
2017-07-03 22:41:10 +08:00
|
|
|
} // namespace utils
|