CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Constraint.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2023 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
13
15
17
18#include <cstdlib>
19#include <map>
20#include <vector>
21
23
30
39 private:
40 class Data;
42
43 public:
44 Constraint() = default;
46 Constraint(const Constraint& other, const ConstraintStrength& strength) : mData(new Data(other, strength)) {}
47
48 Constraint(const Constraint&) = default;
49 Constraint& operator=(const Constraint&) = default;
50
53
55
56 public:
57 [[nodiscard]] const ConstraintExpression& getExpression() const { return mData->mExpression; }
58 [[nodiscard]] ConstraintRelationalOperator getOperator() const { return mData->mOperator; }
59 [[nodiscard]] const ConstraintStrength& getStrength() const { return mData->mStrength; }
60
61 [[nodiscard]] bool isViolated() const;
62 [[nodiscard]] bool isSatisfied() const noexcept { return !isViolated(); }
63 [[nodiscard]] bool operator!() const { return !mData; }
64
65 public:
68
70 friend std::ostream& operator<<(std::ostream& stream, const Constraint& constraint);
71
72 private:
74
75 class Data : public RefCounted<Data, RefCounter<false>> {
76 public:
79
80 Data(const Constraint& other, const ConstraintStrength& strength)
81 : mExpression(other.getExpression()), mStrength(strength), mOperator(other.getOperator()) {}
82
83 ~Data() = default;
84
88
89 private:
90 Data(const Data& other);
91 Data& operator=(const Data& other);
92 };
93
94 public:
95 friend bool operator<(const Constraint& lhs, const Constraint& rhs) { return lhs.mData.get() < rhs.mData.get(); }
96 friend bool operator==(const Constraint& lhs, const Constraint& rhs) { return lhs.mData == rhs.mData; }
97 friend bool operator!=(const Constraint& lhs, const Constraint& rhs) { return lhs.mData != rhs.mData; }
98 };
99
100
101 // Variable multiply, divide, and unary invert
105
106 // ConstraintExpression::Term multiply, divide, and unary invert
107 inline ConstraintExpression::Term operator*(const ConstraintExpression::Term& term, const double coefficient) { return ConstraintExpression::Term(term.getVariable(), term.getCoefficient() * coefficient); }
110
111 // Expression multiply, divide, and unary invert
112 inline ConstraintExpression operator*(const ConstraintExpression& expression, const double coefficient) {
114 terms.reserve(expression.getTerms().size());
115
116 for(const ConstraintExpression::Term& term : expression.getTerms())
117 terms.push_back(term * coefficient);
118
119 return ConstraintExpression(std::move(terms), expression.getConstant() * coefficient);
120 }
121
122 inline ConstraintExpression operator/(const ConstraintExpression& expression, const double denominator) { return expression * (1.0 / denominator); }
123 inline ConstraintExpression operator-(const ConstraintExpression& expression) { return expression * -1.0; }
124
125 // Double multiply
126 inline ConstraintExpression operator*(const double coefficient, const ConstraintExpression& expression) { return expression * coefficient; }
129
130 // Expression add and subtract
133 terms.reserve(first.getTerms().size() + second.getTerms().size());
134 terms.insert(terms.begin(), first.getTerms().begin(), first.getTerms().end());
135 terms.insert(terms.end(), second.getTerms().begin(), second.getTerms().end());
136 return ConstraintExpression(std::move(terms), first.getConstant() + second.getConstant());
137 }
138
141 terms.reserve(first.getTerms().size() + 1);
142 terms.insert(terms.begin(), first.getTerms().begin(), first.getTerms().end());
143 terms.push_back(second);
144 return ConstraintExpression(std::move(terms), first.getConstant());
145 }
146
148 inline ConstraintExpression operator+(const ConstraintExpression& expression, const double constant) { return ConstraintExpression(expression.getTerms(), expression.getConstant() + constant); }
150 inline ConstraintExpression operator-(const ConstraintExpression& expression, const ConstraintExpression::Term& term) { return expression + -term; }
151 inline ConstraintExpression operator-(const ConstraintExpression& expression, const ConstraintVariable& variable) { return expression + -variable; }
152 inline ConstraintExpression operator-(const ConstraintExpression& expression, const double constant) { return expression + -constant; }
153
154 // ConstraintExpression::Term add and subtract
155 inline ConstraintExpression operator+(const ConstraintExpression::Term& term, const ConstraintExpression& expression) { return expression + term; }
158 inline ConstraintExpression operator+(const ConstraintExpression::Term& term, const double constant) { return ConstraintExpression(term, constant); }
159 inline ConstraintExpression operator-(const ConstraintExpression::Term& term, const ConstraintExpression& expression) { return -expression + term; }
162 inline ConstraintExpression operator-(const ConstraintExpression::Term& term, const double constant) { return term + -constant; }
163
164 // Variable add and subtract
165 inline ConstraintExpression operator+(const ConstraintVariable& variable, const ConstraintExpression& expression) { return expression + variable; }
168 inline ConstraintExpression operator+(const ConstraintVariable& variable, const double constant) { return ConstraintExpression::Term(variable) + constant; }
169 inline ConstraintExpression operator-(const ConstraintVariable& variable, const ConstraintExpression& expression) { return variable + -expression; }
171 inline ConstraintExpression operator-(const ConstraintVariable& first, const ConstraintVariable& second) { return first + -second; }
172 inline ConstraintExpression operator-(const ConstraintVariable& variable, const double constant) { return variable + -constant; }
173
174 // Double add and subtract
175 inline ConstraintExpression operator+(const double constant, const ConstraintExpression& expression) { return expression + constant; }
176 inline ConstraintExpression operator+(const double constant, const ConstraintExpression::Term& term) { return term + constant; }
177 inline ConstraintExpression operator+(const double constant, const ConstraintVariable& variable) { return variable + constant; }
178 inline ConstraintExpression operator-(const double constant, const ConstraintExpression& expression) { return -expression + constant; }
179 inline ConstraintExpression operator-(const double constant, const ConstraintExpression::Term& term) { return -term + constant; }
180 inline ConstraintExpression operator-(const double constant, const ConstraintVariable& variable) { return -variable + constant; }
181
182 // Expression relations
184 inline Constraint operator==(const ConstraintExpression& expression, const ConstraintExpression::Term& term) { return expression == ConstraintExpression(term); }
186 inline Constraint operator==(const ConstraintExpression& expression, const double constant) { return expression == ConstraintExpression(constant); }
188 inline Constraint operator<=(const ConstraintExpression& expression, const ConstraintExpression::Term& term) { return expression <= ConstraintExpression(term); }
190 inline Constraint operator<=(const ConstraintExpression& expression, const double constant) { return expression <= ConstraintExpression(constant); }
192 inline Constraint operator>=(const ConstraintExpression& expression, const ConstraintExpression::Term& term) { return expression >= ConstraintExpression(term); }
194 inline Constraint operator>=(const ConstraintExpression& expression, const double constant) { return expression >= ConstraintExpression(constant); }
195
196 // ConstraintExpression::Term relations
197 inline Constraint operator==(const ConstraintExpression::Term& term, const ConstraintExpression& expression) { return expression == term; }
200 inline Constraint operator==(const ConstraintExpression::Term& term, const double constant) { return ConstraintExpression(term) == constant; }
201 inline Constraint operator<=(const ConstraintExpression::Term& term, const ConstraintExpression& expression) { return expression >= term; }
204 inline Constraint operator<=(const ConstraintExpression::Term& term, const double constant) { return ConstraintExpression(term) <= constant; }
205 inline Constraint operator>=(const ConstraintExpression::Term& term, const ConstraintExpression& expression) { return expression <= term; }
208 inline Constraint operator>=(const ConstraintExpression::Term& term, const double constant) { return ConstraintExpression(term) >= constant; }
209
210 // Variable relations
211 inline Constraint operator==(const ConstraintVariable& variable, const ConstraintExpression& expression) { return expression == variable; }
214 inline Constraint operator==(const ConstraintVariable& variable, const double constant) { return ConstraintExpression::Term(variable) == constant; }
215 inline Constraint operator<=(const ConstraintVariable& variable, const ConstraintExpression& expression) { return expression >= variable; }
218 inline Constraint operator<=(const ConstraintVariable& variable, const double constant) { return ConstraintExpression::Term(variable) <= constant; }
219 inline Constraint operator>=(const ConstraintVariable& variable, const ConstraintExpression& expression) { return expression <= variable; }
222 inline Constraint operator>=(const ConstraintVariable& variable, const double constant) { return ConstraintExpression::Term(variable) >= constant; }
223
224 // Double relations
225 inline Constraint operator==(const double constant, const ConstraintExpression& expression) { return expression == constant; }
226 inline Constraint operator==(const double constant, const ConstraintExpression::Term& term) { return term == constant; }
227 inline Constraint operator==(const double constant, const ConstraintVariable& variable) { return variable == constant; }
228 inline Constraint operator<=(const double constant, const ConstraintExpression& expression) { return expression >= constant; }
229 inline Constraint operator<=(const double constant, const ConstraintExpression::Term& term) { return term >= constant; }
230 inline Constraint operator<=(const double constant, const ConstraintVariable& variable) { return variable >= constant; }
231 inline Constraint operator>=(const double constant, const ConstraintExpression& expression) { return expression <= constant; }
232 inline Constraint operator>=(const double constant, const ConstraintExpression::Term& term) { return term <= constant; }
233 inline Constraint operator>=(const double constant, const ConstraintVariable& variable) { return variable <= constant; }
234
235 // Constraint strength modifier
236 inline Constraint operator|(const Constraint& constraint, const ConstraintStrength& strength) { return Constraint(constraint, strength); }
237 inline Constraint operator|(const ConstraintStrength& strength, const Constraint& constraint) { return constraint | strength; }
238
239} // namespace CeresEngine::Constraint
Definition Constraint.hpp:75
Data & operator=(const Data &other)
Data(const Constraint &other, const ConstraintStrength &strength)
Definition Constraint.hpp:80
Data(const ConstraintExpression &expr, const ConstraintRelationalOperator op, const ConstraintStrength &strength)
Definition Constraint.hpp:77
ConstraintRelationalOperator mOperator
Definition Constraint.hpp:87
ConstraintStrength mStrength
Definition Constraint.hpp:86
ConstraintExpression mExpression
Definition Constraint.hpp:85
Definition ConstraintExpression.hpp:58
Represents a constraint mathematical expression.
Definition ConstraintExpression.hpp:19
const Vector< Term > & getTerms() const
Definition ConstraintExpression.hpp:42
double getConstant() const
Definition ConstraintExpression.hpp:45
An equation or inequality involving one or more variables.
Definition Constraint.hpp:38
Constraint(const ConstraintExpression &expr, const ConstraintRelationalOperator op, const ConstraintStrength &strength=ConstraintStrength::required)
Definition Constraint.hpp:45
ConstraintRelationalOperator getOperator() const
Definition Constraint.hpp:58
friend bool operator!=(const Constraint &lhs, const Constraint &rhs)
Definition Constraint.hpp:97
bool isSatisfied() const noexcept
Definition Constraint.hpp:62
friend std::ostream & operator<<(std::ostream &stream, const Constraint &constraint)
Writes the constraint to the given stream.
static ConstraintExpression reduce(const ConstraintExpression &expr)
Constraint(const Constraint &other, const ConstraintStrength &strength)
Definition Constraint.hpp:46
bool operator!() const
Definition Constraint.hpp:63
const ConstraintExpression & getExpression() const
Definition Constraint.hpp:57
const ConstraintStrength & getStrength() const
Definition Constraint.hpp:59
friend bool operator<(const Constraint &lhs, const Constraint &rhs)
Definition Constraint.hpp:95
Constraint(Constraint &&) noexcept=default
String toString() const
Gets a string representation of the constraint.
Constraint(const Constraint &)=default
friend bool operator==(const Constraint &lhs, const Constraint &rhs)
Definition Constraint.hpp:96
RC< Data > mData
Definition Constraint.hpp:41
Constraint & operator=(const Constraint &)=default
Every constraint has a strength that determines where it sits in the hierarchy; strong constraints ar...
Definition ConstraintStrength.hpp:91
static const ConstraintStrength required
Constraints with this strength must be satisfied.
Definition ConstraintStrength.hpp:121
A variable as used in an expression.
Definition ConstraintVariable.hpp:50
A retain-release type of smart pointer.
Definition SmartPtr.hpp:132
A simple reference counter base class.
Definition SmartPtr.hpp:438
Definition Constraint.hpp:22
Constraint operator==(const ConstraintExpression &first, const ConstraintExpression &second)
Definition Constraint.hpp:183
ConstraintRelationalOperator
Specifies the relation operator of a constraint.
Definition Constraint.hpp:25
Constraint operator<=(const ConstraintExpression &first, const ConstraintExpression &second)
Definition Constraint.hpp:187
ConstraintExpression operator+(const ConstraintExpression &first, const ConstraintExpression &second)
Definition Constraint.hpp:131
Constraint operator>=(const ConstraintExpression &first, const ConstraintExpression &second)
Definition Constraint.hpp:191
ConstraintExpression::Term operator/(const ConstraintVariable &variable, const double denominator)
Definition Constraint.hpp:103
Constraint operator|(const Constraint &constraint, const ConstraintStrength &strength)
Definition Constraint.hpp:236
ConstraintExpression::Term operator*(const ConstraintVariable &variable, const double coefficient)
Definition Constraint.hpp:102
ConstraintExpression::Term operator-(const ConstraintVariable &variable)
Definition Constraint.hpp:104
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
constexpr ReduceAlgorithmFunctor reduce
Sums up (or accumulate with a custom function) a range of elements, except out of order.
Definition Reduce.hpp:110
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25