MCRO
C++23 utilities for Unreal Engine.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
Zero.h
Go to the documentation of this file.
1/** @noop License Comment
2 * @file
3 * @copyright
4 * This Source Code is subject to the terms of the Mozilla Public License, v2.0.
5 * If a copy of the MPL was not distributed with this file You can obtain one at
6 * https://mozilla.org/MPL/2.0/
7 *
8 * @author David Mórász
9 * @date 2025
10 */
11
12#pragma once
13
14#include "CoreMinimal.h"
15#include "Mcro/Concepts.h"
16
17namespace Mcro::Zero
18{
19 using namespace Mcro::Concepts;
20
21 /**
22 * @brief
23 * A type which acts like a number, but it always returns another FZero for any operations and converting it to
24 * any scalar type yields 0. So if an FZero is found in a chain of operation the result will be always 0
25 */
26 struct FZero
27 {
28 FORCEINLINE FZero() {}
29 FORCEINLINE FZero(FZero const&) {}
30 FORCEINLINE FZero(FZero&&) {}
31
32 template <CScalar T>
33 operator T() { return 0; }
34
35 template <CScalar T>
36 FZero(T) {}
37
38 template <CScalar T> FZero& operator = (T) { return *this; }
39 template <CScalar T> FZero& operator += (T) { return *this; }
40 template <CScalar T> FZero& operator -= (T) { return *this; }
41 template <CScalar T> FZero& operator *= (T) { return *this; }
42 template <CScalar T> FZero& operator /= (T) { return *this; }
43 template <CScalar T> FZero& operator %= (T) { return *this; }
44 template <CScalar T> FZero& operator &= (T) { return *this; }
45 template <CScalar T> FZero& operator |= (T) { return *this; }
46 template <CScalar T> FZero& operator ^= (T) { return *this; }
47 template <CScalar T> FZero& operator <<= (T) { return *this; }
48 template <CScalar T> FZero& operator >>= (T) { return *this; }
49
50 FORCEINLINE FZero& operator ++ () { return *this; }
51 FORCEINLINE FZero& operator ++ (int) { return *this; }
52 FORCEINLINE FZero& operator -- () { return *this; }
53 FORCEINLINE FZero& operator -- (int) { return *this; }
54
55 FORCEINLINE FZero operator + () const { return *this; }
56 FORCEINLINE FZero operator - () const { return *this; }
57 FORCEINLINE FZero operator ~ () const { return *this; }
58
59 template <CScalar T> friend FZero operator + (FZero zero, T) { return zero; }
60 template <CScalar T> friend FZero operator - (FZero zero, T) { return zero; }
61 template <CScalar T> friend FZero operator * (FZero zero, T) { return zero; }
62 template <CScalar T> friend FZero operator / (FZero zero, T) { return zero; }
63 template <CScalar T> friend FZero operator % (FZero zero, T) { return zero; }
64 template <CScalar T> friend FZero operator & (FZero zero, T) { return zero; }
65 template <CScalar T> friend FZero operator | (FZero zero, T) { return zero; }
66 template <CScalar T> friend FZero operator ^ (FZero zero, T) { return zero; }
67 template <CScalar T> friend FZero operator << (FZero zero, T) { return zero; }
68 template <CScalar T> friend FZero operator >> (FZero zero, T) { return zero; }
69
70 template <CScalar T> friend FZero operator + (T, FZero zero) { return zero; }
71 template <CScalar T> friend FZero operator - (T, FZero zero) { return zero; }
72 template <CScalar T> friend FZero operator * (T, FZero zero) { return zero; }
73 template <CScalar T> friend FZero operator / (T, FZero zero) { return zero; }
74 template <CScalar T> friend FZero operator % (T, FZero zero) { return zero; }
75 template <CScalar T> friend FZero operator & (T, FZero zero) { return zero; }
76 template <CScalar T> friend FZero operator | (T, FZero zero) { return zero; }
77 template <CScalar T> friend FZero operator ^ (T, FZero zero) { return zero; }
78 template <CScalar T> friend FZero operator << (T, FZero zero) { return zero; }
79 template <CScalar T> friend FZero operator >> (T, FZero zero) { return zero; }
80
81 template <CScalar T> friend bool operator == (FZero, T scalar) { return scalar == 0; }
82 template <CScalar T> friend bool operator != (FZero, T scalar) { return scalar != 0; }
83 template <CScalar T> friend bool operator <=> (FZero, T scalar) { return scalar <=> 0; }
84
85 template <CScalar T> friend bool operator == (T scalar, FZero) { return scalar == 0; }
86 template <CScalar T> friend bool operator != (T scalar, FZero) { return scalar != 0; }
87 template <CScalar T> friend bool operator <=> (T scalar, FZero) { return 0 <=> scalar; }
88 };
89}
This header exists because STL headers in Android doesn't define STL concepts (other than same_as whi...
A type which acts like a number, but it always returns another FZero for any operations and convertin...
Definition Zero.h:27
FZero & operator*=(T)
Definition Zero.h:41
FZero & operator<<=(T)
Definition Zero.h:47
FZero & operator&=(T)
Definition Zero.h:44
FORCEINLINE FZero operator-() const
Definition Zero.h:56
FORCEINLINE FZero()
Definition Zero.h:28
friend FZero operator^(FZero zero, T)
Definition Zero.h:66
FORCEINLINE FZero & operator--()
Definition Zero.h:52
FZero & operator>>=(T)
Definition Zero.h:48
FORCEINLINE FZero & operator++()
Definition Zero.h:50
FORCEINLINE FZero(FZero &&)
Definition Zero.h:30
friend FZero operator<<(FZero zero, T)
Definition Zero.h:67
friend FZero operator*(FZero zero, T)
Definition Zero.h:61
FORCEINLINE FZero operator~() const
Definition Zero.h:57
friend FZero operator%(FZero zero, T)
Definition Zero.h:63
FZero & operator/=(T)
Definition Zero.h:42
friend bool operator==(FZero, T scalar)
Definition Zero.h:81
friend FZero operator|(FZero zero, T)
Definition Zero.h:65
FZero & operator=(T)
Definition Zero.h:38
friend FZero operator>>(FZero zero, T)
Definition Zero.h:68
FZero & operator^=(T)
Definition Zero.h:46
FZero & operator|=(T)
Definition Zero.h:45
friend FZero operator&(FZero zero, T)
Definition Zero.h:64
FZero & operator-=(T)
Definition Zero.h:40
FORCEINLINE FZero operator+() const
Definition Zero.h:55
friend bool operator!=(FZero, T scalar)
Definition Zero.h:82
friend bool operator<=>(FZero, T scalar)
Definition Zero.h:83
FORCEINLINE FZero(FZero const &)
Definition Zero.h:29
FZero & operator+=(T)
Definition Zero.h:39
friend FZero operator/(FZero zero, T)
Definition Zero.h:62
FZero & operator%=(T)
Definition Zero.h:43