| /********************************************************************** |
| * File: mod128.h (Formerly dir128.h) |
| * Description: Header for class which implements modulo arithmetic. |
| * Author: Ray Smith |
| * Created: Tue Mar 26 17:48:13 GMT 1991 |
| * |
| * (C) Copyright 1991, Hewlett-Packard Ltd. |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| * |
| **********************************************************************/ |
| |
| #ifndef MOD128_H |
| #define MOD128_H |
| |
| #include "points.h" |
| |
| #define MODULUS 128 /*range of directions */ |
| #define DIRBITS 7 //no of bits used |
| #define DIRSCALE 1000 //length of vector |
| |
| class DLLSYM DIR128 |
| { |
| public: |
| DIR128() { |
| } //empty constructor |
| |
| DIR128( //constructor |
| inT16 value) { //value to assign |
| value %= MODULUS; //modulo arithmetic |
| if (value < 0) |
| value += MODULUS; //done properly |
| dir = (inT8) value; |
| } |
| DIR128(const FCOORD fc); //quantize vector |
| |
| DIR128 & operator= ( //assign of inT16 |
| inT16 value) { //value to assign |
| value %= MODULUS; //modulo arithmetic |
| if (value < 0) |
| value += MODULUS; //done properly |
| dir = (inT8) value; |
| return *this; |
| } |
| inT8 operator- ( //subtraction |
| const DIR128 & minus) const//for signed result |
| { |
| //result |
| inT16 result = dir - minus.dir; |
| |
| if (result > MODULUS / 2) |
| result -= MODULUS; //get in range |
| else if (result < -MODULUS / 2) |
| result += MODULUS; |
| return (inT8) result; |
| } |
| DIR128 operator+ ( //addition |
| const DIR128 & add) const //of itself |
| { |
| DIR128 result; //sum |
| |
| result = dir + add.dir; //let = do the work |
| return result; |
| } |
| DIR128 & operator+= ( //same as + |
| const DIR128 & add) { |
| *this = dir + add.dir; //let = do the work |
| return *this; |
| } |
| inT8 get_dir() const { //access function |
| return dir; |
| } |
| ICOORD vector() const; //turn to vector |
| |
| private: |
| inT8 dir; //a direction |
| }; |
| #endif |