71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
// Copyright 2021 Memgraph Ltd.
|
|
//
|
|
// Use of this software is governed by the Business Source License
|
|
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
|
|
// License, and you may not use this file except in compliance with the Business Source License.
|
|
//
|
|
// As of the Change Date specified in that file, in accordance with
|
|
// the Business Source License, use of this software will be governed
|
|
// by the Apache License, Version 2.0, included in the file
|
|
// licenses/APL.txt.
|
|
|
|
#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_; }
|
|
auto IsInclusive() const { return type_ == BoundType::INCLUSIVE; }
|
|
auto IsExclusive() const { return type_ == BoundType::EXCLUSIVE; }
|
|
|
|
private:
|
|
TValue value_;
|
|
Type type_;
|
|
};
|
|
|
|
/**
|
|
* 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);
|
|
};
|
|
|
|
} // namespace utils
|