2 * Copyright (c) 2002-2003 The Regents of The University of Michigan
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 template<class T, T MV>
34 // Compiler should optimize this
35 void setValue(T n) { value = n % MV; }
39 ModNum(T n) { setValue(n); }
40 ModNum(const ModNum<T, MV> &n) : value(n.value) {}
42 ModNum operator=(T n) {
47 const ModNum operator=(ModNum n) {
52 // Return the value if object used as RHS
53 operator T() const { return value; }
58 const ModNum<T, MV> operator+=(ModNum<T, MV> r) {
59 setValue(value + r.value);
63 const ModNum<T, MV> operator+=(T r) {
71 const ModNum<T, MV> operator-=(ModNum<T, MV> r) {
72 setValue(value - r.value);
76 const ModNum<T, MV> operator-=(T r) {
85 const ModNum<T, MV> operator++() {
91 const ModNum<T, MV> operator++(int) {
92 ModNum<T, MV> rv = *this;
103 const ModNum<T, MV> operator--() {
108 // POSTFIX (like a--)
109 const ModNum<T, MV> operator--(int) {
110 ModNum<T, MV> rv = *this;
118 // Define operator "+" like this to avoid creating a temporary
120 template<class T, T MV>
122 operator+(ModNum<T, MV> l, ModNum<T, MV> r) {
127 template<class T, T MV>
129 operator+(ModNum<T, MV> l, T r) {
134 template<class T, T MV>
136 operator+(T l, ModNum<T, MV> r) {
143 // Define operator "-" like this to avoid creating a temporary
145 template<class T, T MV>
147 operator-(ModNum<T, MV> l, ModNum<T, MV> r) {
152 template<class T, T MV>
154 operator-(ModNum<T, MV> l, T r) {
159 template<class T, T MV>
161 operator-(T l, ModNum<T, MV> r) {
168 // Comparison operators
169 // (all other cases are handled with conversons)
171 template<class T, T MV>
173 operator<(ModNum<T, MV> l, ModNum<T, MV> r) {
174 return l.value < r.value;
177 template<class T, T MV>
179 operator>(ModNum<T, MV> l, ModNum<T, MV> r) {
180 return l.value > r.value;
183 template<class T, T MV>
185 operator==(ModNum<T, MV> l, ModNum<T, MV> r) {
186 return l.value == r.value;
189 template<class T, T MV>
191 operator<=(ModNum<T, MV> l, ModNum<T, MV> r) {
192 return l.value <= r.value;
195 template<class T, T MV>
197 operator>=(ModNum<T, MV> l, ModNum<T, MV> r) {
198 return l.value >= r.value;