Skip to content

Commit 8cfd2fd

Browse files
committed
Binary operators for mi
1 parent 411581d commit 8cfd2fd

File tree

1 file changed

+69
-6
lines changed

1 file changed

+69
-6
lines changed

mainframe/missing.hpp

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,42 +60,105 @@ template< typename T, typename U >
6060
auto operator+( const mi<T>& t, const mi<U>& u ) -> mi<decltype(*t + *u)>
6161
{
6262
if ( !t || !u ) { return missing; }
63-
return mi<decltype(*t+*u)>( *t + *u );
63+
return mi<decltype(*t + *u)>( *t + *u );
6464
}
6565

6666
template< typename T, typename U >
6767
auto operator+( const mi<T>& t, const U& u ) -> mi<decltype(*t + u)>
6868
{
6969
if ( !t ) { return missing; }
70-
return mi<decltype(*t+u)>{ *t + u };
70+
return mi<decltype(*t + u)>{ *t + u };
7171
}
7272

7373
template< typename T, typename U >
7474
auto operator+( const T& t, const mi<U>& u ) -> mi<decltype(t + *u)>
7575
{
7676
if ( !u ) { return missing; }
77-
return mi<decltype(t+*u)>{ t + *u };
77+
return mi<decltype(t + *u)>{ t + *u };
7878
}
7979

8080
template< typename T, typename U >
8181
auto operator-( const mi<T>& t, const mi<U>& u ) -> mi<decltype(*t - *u)>
8282
{
8383
if ( !t || !u ) { return missing; }
84-
return mi<decltype(*t-*u)>( *t - *u );
84+
return mi<decltype(*t - *u)>( *t - *u );
8585
}
8686

8787
template< typename T, typename U >
8888
auto operator-( const mi<T>& t, const U& u ) -> mi<decltype(*t - u)>
8989
{
9090
if ( !t ) { return missing; }
91-
return mi<decltype(*t-u)>{ *t - u };
91+
return mi<decltype(*t - u)>{ *t - u };
9292
}
9393

9494
template< typename T, typename U >
9595
auto operator-( const T& t, const mi<U>& u ) -> mi<decltype(t - *u)>
9696
{
9797
if ( !u ) { return missing; }
98-
return mi<decltype(t-*u)>{ t - *u };
98+
return mi<decltype(t - *u)>{ t - *u };
99+
}
100+
101+
template< typename T, typename U >
102+
auto operator*( const mi<T>& t, const mi<U>& u ) -> mi<decltype(*t * *u)>
103+
{
104+
if ( !t || !u ) { return missing; }
105+
return mi<decltype(*t * *u)>( *t * *u );
106+
}
107+
108+
template< typename T, typename U >
109+
auto operator*( const mi<T>& t, const U& u ) -> mi<decltype(*t * u)>
110+
{
111+
if ( !t ) { return missing; }
112+
return mi<decltype(*t * u)>{ *t * u };
113+
}
114+
115+
template< typename T, typename U >
116+
auto operator*( const T& t, const mi<U>& u ) -> mi<decltype(t * *u)>
117+
{
118+
if ( !u ) { return missing; }
119+
return mi<decltype(t * *u)>{ t * *u };
120+
}
121+
122+
template< typename T, typename U >
123+
auto operator/( const mi<T>& t, const mi<U>& u ) -> mi<decltype(*t / *u)>
124+
{
125+
if ( !t || !u ) { return missing; }
126+
return mi<decltype(*t / *u)>( *t / *u );
127+
}
128+
129+
template< typename T, typename U >
130+
auto operator/( const mi<T>& t, const U& u ) -> mi<decltype(*t / u)>
131+
{
132+
if ( !t ) { return missing; }
133+
return mi<decltype(*t / u)>{ *t / u };
134+
}
135+
136+
template< typename T, typename U >
137+
auto operator/( const T& t, const mi<U>& u ) -> mi<decltype(t / *u)>
138+
{
139+
if ( !u ) { return missing; }
140+
return mi<decltype(t / *u)>{ t / *u };
141+
}
142+
143+
template< typename T, typename U >
144+
auto operator%( const mi<T>& t, const mi<U>& u ) -> mi<decltype(*t % *u)>
145+
{
146+
if ( !t || !u ) { return missing; }
147+
return mi<decltype(*t % *u)>( *t % *u );
148+
}
149+
150+
template< typename T, typename U >
151+
auto operator%( const mi<T>& t, const U& u ) -> mi<decltype(*t % u)>
152+
{
153+
if ( !t ) { return missing; }
154+
return mi<decltype(*t % u)>{ *t % u };
155+
}
156+
157+
template< typename T, typename U >
158+
auto operator%( const T& t, const mi<U>& u ) -> mi<decltype(t % *u)>
159+
{
160+
if ( !u ) { return missing; }
161+
return mi<decltype(t % *u)>{ t % *u };
99162
}
100163

101164
template <typename _Tp> mi(_Tp) -> mi<_Tp>;

0 commit comments

Comments
 (0)