xmscore  1.0
pt.h
Go to the documentation of this file.
1 #pragma once
2 //------------------------------------------------------------------------------
7 //------------------------------------------------------------------------------
8 
9 //----- Included files ---------------------------------------------------------
10 
11 // 3. Standard Library Headers
12 #include <iosfwd> // fwd decl ostream
13 #include <stdexcept>
14 
15 // 4. External Library Headers
16 
17 // 5. Shared Headers
18 #include <xmscore/points/ptsfwd.h>
19 
20 namespace xms
21 {
22 //------------------------------------------------------------------------------
23 // NOTES: All member functions are defined here. None are defined in .cpp files.
24 // See the notes below from MSDN "Members of Class Templates".
25 //
26 // C++ member templates are supported as long as they are fully defined within
27 // the enclosing class. For example, the following is supported:
28 //
29 // template<typename T>
30 // class X
31 // {
32 // public:
33 // template<typename U>
34 // void mf(const U &u)
35 // {
36 // }
37 // };
38 //
39 // While the following is not:
40 // template<typename T>
41 // class X
42 // {
43 // public:
44 // template<typename U>
45 // void mf(const U &u);
46 // };
47 //
48 // template<typename T> template <typename U>
49 // void X<T>::mf(const U &u)
50 // {
51 // }
52 //------------------------------------------------------------------------------
53 
54 //----- Forward declarations ---------------------------------------------------
55 
56 // Moved to ptsfwd.h so that you can include just that file instead.
57 // template <class T> class Pt2;
58 // template <class T> class Pt3;
59 // template <class T> class Pt4;
60 
61 //----- Typedefs ---------------------------------------------------------------
62 
63 // Moved to ptsfwd.h so that you can include just that file instead.
64 // typedef Pt2<int> Pt2i;
65 // typedef Pt2<float> Pt2f;
66 // typedef Pt2<double> Pt2d;
67 //
68 // typedef Pt3<int> Pt3i;
69 // typedef Pt3<float> Pt3f;
70 // typedef Pt3<double> Pt3d;
71 //
72 // typedef Pt4<int> Pt4i;
73 // typedef Pt4<float> Pt4f;
74 // typedef Pt4<double> Pt4d;
75 
76 //----- Classes / Structs ------------------------------------------------------
77 
81 template <class T>
82 class Pt2
83 {
84  // friend std::ostream& operator<<(std::ostream&, const Pt2&);
85 public:
86  // Member variables
87 
88  T x;
89  T y;
90 
91  // Constructors
92 
93  Pt2()
94  : x((T)0)
95  , y((T)0)
96  {
97  }
98  Pt2(T a_x, T a_y)
102  : x(a_x)
103  , y(a_y)
104  {
105  }
108  explicit Pt2(const T& a)
109  : x(a)
110  , y(a)
111  {
112  }
113  // (single arg ctors should be explicit)
114 
115  // copy constructor
117  Pt2(const Pt2& a)
118  : x(a.x)
119  , y(a.y)
120  {
121  }
122 
123  // constructors for conversions (all explicit)
126  template <class U>
127  explicit Pt2(const Pt2<U>& a)
128  : x((T)a.x)
129  , y((T)a.y)
130  {
131  }
134  template <class U>
135  explicit Pt2(const Pt3<U>& a)
136  : x((T)a.x)
137  , y((T)a.y)
138  {
139  }
142  template <class U>
143  explicit Pt2(const Pt4<U>& a)
144  : x((T)a.x)
145  , y((T)a.y)
146  {
147  }
148 
149  // Destructor
150 
151  ~Pt2() {}
152 
156  template <class U>
157  inline const Pt2& operator=(const U& a)
158  {
159  x = (T)a;
160  y = (T)a;
161  return *this;
162  }
166  template <class U>
167  inline const Pt2& operator=(const Pt2<U>& a)
168  {
169  x = (T)a.x;
170  y = (T)a.y;
171  return *this;
172  }
176  template <class U>
177  inline const Pt2& operator=(const Pt3<U>& a)
178  {
179  x = (T)a.x;
180  y = (T)a.y;
181  return *this;
182  }
186  template <class U>
187  inline const Pt2& operator=(const Pt4<U>& a)
188  {
189  x = (T)a.x;
190  y = (T)a.y;
191  return *this;
192  }
193 
194  // Logical operators
195 
199  template <class U>
200  inline bool operator==(const U& a) const
201  {
202  return (x == a && y == a);
203  }
207  template <class U>
208  inline bool operator==(const Pt2<U>& a) const
209  {
210  return (x == a.x && y == a.y);
211  }
215  template <class U>
216  inline bool operator==(const Pt3<U>& a) const
217  {
218  return (x == a.x && y == a.y);
219  }
223  template <class U>
224  inline bool operator==(const Pt4<U>& a) const
225  {
226  return (x == a.x && y == a.y);
227  }
228 
232  template <class U>
233  inline bool operator!=(const U& a) const
234  {
235  return !(*this == a);
236  }
240  template <class U>
241  inline bool operator!=(const Pt2<U>& a) const
242  {
243  return !(*this == a);
244  }
248  template <class U>
249  inline bool operator!=(const Pt3<U>& a) const
250  {
251  return !(*this == a);
252  }
256  template <class U>
257  inline bool operator!=(const Pt4<U>& a) const
258  {
259  return !(*this == a);
260  }
261 
265  template <class U>
266  inline bool operator<(const U& a) const
267  {
268  if (x < a)
269  return 1;
270  else if (x > a)
271  return 0;
272  else
273  {
274  if (y < a)
275  return 1;
276  else
277  return 0;
278  }
279  }
283  template <class U>
284  inline bool operator<(const Pt2<U>& a) const
285  {
286  if (x < a.x)
287  return 1;
288  else if (x > a.x)
289  return 0;
290  else
291  {
292  if (y < a.y)
293  return 1;
294  else
295  return 0;
296  }
297  }
301  template <class U>
302  inline bool operator<(const Pt3<U>& a) const
303  {
304  if (x < a.x)
305  return 1;
306  else if (x > a.x)
307  return 0;
308  else
309  {
310  if (y < a.y)
311  return 1;
312  else
313  return 0;
314  }
315  }
319  template <class U>
320  inline bool operator<(const Pt4<U>& a) const
321  {
322  if (x < a.x)
323  return 1;
324  else if (x > a.x)
325  return 0;
326  else
327  {
328  if (y < a.y)
329  return 1;
330  else
331  return 0;
332  }
333  }
334 
338  template <class U>
339  inline bool operator<=(const U& a) const
340  {
341  return (*this < a || *this == a);
342  }
346  template <class U>
347  inline bool operator<=(const Pt2<U>& a) const
348  {
349  return (*this < a || *this == a);
350  }
354  template <class U>
355  inline bool operator<=(const Pt3<U>& a) const
356  {
357  return (*this < a || *this == a);
358  }
362  template <class U>
363  inline bool operator<=(const Pt4<U>& a) const
364  {
365  return (*this < a || *this == a);
366  }
367 
371  template <class U>
372  inline bool operator>(const U& a) const
373  {
374  return !(*this <= a);
375  }
379  template <class U>
380  inline bool operator>(const Pt2<U>& a) const
381  {
382  return !(*this <= a);
383  }
387  template <class U>
388  inline bool operator>(const Pt3<U>& a) const
389  {
390  return !(*this <= a);
391  }
395  template <class U>
396  inline bool operator>(const Pt4<U>& a) const
397  {
398  return !(*this <= a);
399  }
400 
404  template <class U>
405  inline bool operator>=(const U& a) const
406  {
407  return (*this > a || *this == a);
408  }
412  template <class U>
413  inline bool operator>=(const Pt2<U>& a) const
414  {
415  return (*this > a || *this == a);
416  }
420  template <class U>
421  inline bool operator>=(const Pt3<U>& a) const
422  {
423  return (*this > a || *this == a);
424  }
428  template <class U>
429  inline bool operator>=(const Pt4<U>& a) const
430  {
431  return (*this > a || *this == a);
432  }
433 
434  // Arithmetic operators
435 
439  template <class U>
440  inline Pt2 operator+(const U& a) const // Pt2 + int (etc)
441  {
442  return Pt2((T)(x + a), (T)(y + a));
443  }
447  template <class U>
448  inline Pt2 operator+(const Pt2<U>& a) const // Pt2 + Pt2
449  {
450  return Pt2((T)(x + a.x), (T)(y + a.y));
451  }
455  template <class U>
456  inline Pt2 operator+(const Pt3<U>& a) const // Pt2 + Pt3
457  {
458  return Pt2((T)(x + a.x), (T)(y + a.y));
459  }
463  template <class U>
464  inline Pt2 operator+(const Pt4<U>& a) const // Pt2 + Pt4
465  {
466  return Pt2((T)(x + a.x), (T)(y + a.y));
467  }
468 
472  template <class U>
473  inline Pt2 operator-(const U& a) const // Pt2 - int (etc)
474  {
475  return Pt2((T)(x - a), (T)(y - a));
476  }
480  template <class U>
481  inline Pt2 operator-(const Pt2<U>& a) const // Pt2 - Pt2
482  {
483  return Pt2((T)(x - a.x), (T)(y - a.y));
484  }
488  template <class U>
489  inline Pt2 operator-(const Pt3<U>& a) const // Pt2 - Pt3
490  {
491  return Pt2((T)(x - a.x), (T)(y - a.y));
492  }
496  template <class U>
497  inline Pt2 operator-(const Pt4<U>& a) const // Pt2 - Pt4
498  {
499  return Pt2((T)(x - a.x), (T)(y - a.y));
500  }
501 
504  inline Pt2 operator-() const // -Pt2
505  {
506  return Pt2((T)(-x), (T)(-y));
507  }
508 
512  template <class U>
513  inline Pt2 operator*(const U& a) const // Pt2 * int (etc)
514  {
515  return Pt2((T)(x * a), (T)(y * a));
516  }
520  template <class U>
521  inline Pt2 operator*(const Pt2<U>& a) const // Pt2 * Pt2
522  {
523  return Pt2((T)(x * a.x), (T)(y * a.y));
524  }
528  template <class U>
529  inline Pt2 operator*(const Pt3<U>& a) const // Pt2 * Pt3
530  {
531  return Pt2((T)(x * a.x), (T)(y * a.y));
532  }
536  template <class U>
537  inline Pt2 operator*(const Pt4<U>& a) const // Pt2 * Pt4
538  {
539  return Pt2((T)(x * a.x), (T)(y * a.y));
540  }
541 
545  template <class U>
546  inline Pt2 operator/(const U& a) const // Pt2 / int (etc)
547  {
548  return Pt2((T)(x / a), (T)(y / a));
549  }
553  template <class U>
554  inline Pt2 operator/(const Pt2<U>& a) const // Pt2 / Pt2
555  {
556  return Pt2((T)(x / a.x), (T)(y / a.y));
557  }
561  template <class U>
562  inline Pt2 operator/(const Pt3<U>& a) const // Pt2 / Pt3
563  {
564  return Pt2((T)(x / a.x), (T)(y / a.y));
565  }
569  template <class U>
570  inline Pt2 operator/(const Pt4<U>& a) const // Pt2 / Pt4
571  {
572  return Pt2((T)(x / a.x), (T)(y / a.y));
573  }
574 
578  template <class U>
579  inline void operator+=(const U& a) // Pt2 += int (etc)
580  {
581  x = (T)(x + a);
582  y = (T)(y + a);
583  }
587  template <class U>
588  inline void operator+=(const Pt2<U>& a) // Pt2 += Pt2
589  {
590  x = (T)(x + a.x);
591  y = (T)(y + a.y);
592  }
596  template <class U>
597  inline void operator+=(const Pt3<U>& a) // Pt2 += Pt3
598  {
599  x = (T)(x + a.x);
600  y = (T)(y + a.y);
601  }
605  template <class U>
606  inline void operator+=(const Pt4<U>& a) // Pt2 += Pt4
607  {
608  x = (T)(x + a.x);
609  y = (T)(y + a.y);
610  }
611 
615  template <class U>
616  inline void operator-=(const U& a) // Pt2 -= int (etc)
617  {
618  x = (T)(x - a);
619  y = (T)(y - a);
620  }
624  template <class U>
625  inline void operator-=(const Pt2<U>& a) // Pt2 -= Pt2
626  {
627  x = (T)(x - a.x);
628  y = (T)(y - a.y);
629  }
633  template <class U>
634  inline void operator-=(const Pt3<U>& a) // Pt2 -= Pt3
635  {
636  x = (T)(x - a.x);
637  y = (T)(y - a.y);
638  }
642  template <class U>
643  inline void operator-=(const Pt4<U>& a) // Pt2 -= Pt4
644  {
645  x = (T)(x - a.x);
646  y = (T)(y - a.y);
647  }
648 
652  template <class U>
653  inline void operator*=(const U& a) // Pt2 *= int (etc)
654  {
655  x = (T)(x * a);
656  y = (T)(y * a);
657  }
661  template <class U>
662  inline void operator*=(const Pt2<U>& a) // Pt2 *= Pt2
663  {
664  x = (T)(x * a.x);
665  y = (T)(y * a.y);
666  }
670  template <class U>
671  inline void operator*=(const Pt3<U>& a) // Pt2 *= Pt3
672  {
673  x = (T)(x * a.x);
674  y = (T)(y * a.y);
675  }
679  template <class U>
680  inline void operator*=(const Pt4<U>& a) // Pt2 *= Pt4
681  {
682  x = (T)(x * a.x);
683  y = (T)(y * a.y);
684  }
685 
689  template <class U>
690  inline void operator/=(const U& a) // Pt2 /= int (etc)
691  {
692  x = (T)(x / a);
693  y = (T)(y / a);
694  }
698  template <class U>
699  inline void operator/=(const Pt2<U>& a) // Pt2 /= Pt2
700  {
701  x = (T)(x / a.x);
702  y = (T)(y / a.y);
703  }
707  template <class U>
708  inline void operator/=(const Pt3<U>& a) // Pt2 /= Pt3
709  {
710  x = (T)(x / a.x);
711  y = (T)(y / a.y);
712  }
716  template <class U>
717  inline void operator/=(const Pt4<U>& a) // Pt2 /= Pt4
718  {
719  x = (T)(x / a.x);
720  y = (T)(y / a.y);
721  }
722 
723  // Other stuff
724 
728  void Set(T a_x, T a_y)
729  {
730  x = a_x;
731  y = a_y;
732  }
735  void Set(T a)
736  {
737  x = a;
738  y = a;
739  }
740 
744  T operator[](unsigned int a) const { return *(&x + a); }
748  T& operator[](unsigned int a) { return *(&x + a); }
749 
753  const T& at(unsigned int a) const
754  {
755  switch (a)
756  {
757  case 0:
758  return x;
759  case 1:
760  return y;
761  default:
762  throw std::out_of_range("Pt2<T>::at(): error out of range");
763  }
764  }
768  T& at(unsigned int a) // non-const version
769  {
770  // Use the const version. See Effective C++ 3rd Edition Item 3.
771  return const_cast<T&>(static_cast<const Pt2<T>&>(*this).at(a));
772  }
773 
777  template <typename Archive>
778  void serialize(Archive& archive, const unsigned int version)
779  {
780  (void)version; // For doxygen which couldn't handle commenting it out.
781  archive& x;
782  archive& y;
783  }
784 
785 }; // Pt2
786 
790 template <class T>
791 class Pt3
792 {
793  // friend std::ostream& operator<<(std::ostream&, const Pt3&);
794 public:
795  // Member variables
796 
797  T x;
798  T y;
799  T z;
800 
801  // Constructors
802 
803  Pt3()
804  : x((T)0)
805  , y((T)0)
806  , z((T)0)
807  {
808  }
809  Pt3(T a_x, T a_y, T a_z)
814  : x(a_x)
815  , y(a_y)
816  , z(a_z)
817  {
818  }
822  Pt3(T a_x, T a_y)
823  : x(a_x)
824  , y(a_y)
825  , z(0.0)
826  {
827  }
830  explicit Pt3(T a)
831  : x(a)
832  , y(a)
833  , z(a)
834  {
835  }
836  // (single arg ctors should be explicit)
837 
840  Pt3(const Pt3& a)
841  : x(a.x)
842  , y(a.y)
843  , z(a.z)
844  {
845  }
846 
847  // constructors for conversions (all explicit)
850  template <class U>
851  explicit Pt3(const Pt2<U>& a)
852  : x((T)a.x)
853  , y((T)a.y)
854  , z(0)
855  {
856  }
859  template <class U>
860  explicit Pt3(const Pt3<U>& a)
861  : x((T)a.x)
862  , y((T)a.y)
863  , z((T)a.z)
864  {
865  }
868  template <class U>
869  explicit Pt3(const Pt4<U>& a)
870  : x((T)a.x)
871  , y((T)a.y)
872  , z((T)a.z)
873  {
874  }
875 
876  ~Pt3() {}
877 
881  template <class U>
882  inline const Pt3& operator=(const U& a)
883  {
884  x = (T)a;
885  y = (T)a;
886  z = (T)a;
887  return *this;
888  }
892  template <class U>
893  inline const Pt3& operator=(const Pt2<U>& a)
894  {
895  x = (T)a.x;
896  y = (T)a.y;
897  return *this;
898  }
902  template <class U>
903  inline const Pt3& operator=(const Pt3<U>& a)
904  {
905  x = (T)a.x;
906  y = (T)a.y;
907  z = (T)a.z;
908  return *this;
909  }
913  template <class U>
914  inline const Pt3& operator=(const Pt4<U>& a)
915  {
916  x = (T)a.x;
917  y = (T)a.y;
918  z = (T)a.z;
919  return *this;
920  }
921 
922  // Logical operators
923 
927  template <class U>
928  inline bool operator==(const U& a) const
929  {
930  return (x == a && y == a && z == a);
931  }
935  template <class U>
936  inline bool operator==(const Pt2<U>& a) const
937  {
938  return (x == a.x && y == a.y);
939  }
943  template <class U>
944  inline bool operator==(const Pt3<U>& a) const
945  {
946  return (x == a.x && y == a.y && z == a.z);
947  }
951  template <class U>
952  inline bool operator==(const Pt4<U>& a) const
953  {
954  return (x == a.x && y == a.y && z == a.z);
955  }
956 
960  template <class U>
961  inline bool operator!=(const U& a) const
962  {
963  return !(*this == a);
964  }
968  template <class U>
969  inline bool operator!=(const Pt2<U>& a) const
970  {
971  return !(*this == a);
972  }
976  template <class U>
977  inline bool operator!=(const Pt3<U>& a) const
978  {
979  return !(*this == a);
980  }
984  template <class U>
985  inline bool operator!=(const Pt4<U>& a) const
986  {
987  return !(*this == a);
988  }
989 
993  template <class U>
994  inline bool operator<(const U& a) const
995  {
996  if (x < a)
997  return 1;
998  else if (x > a)
999  return 0;
1000  else
1001  {
1002  if (y < a)
1003  return 1;
1004  else if (y > a)
1005  return 0;
1006  else
1007  {
1008  if (z < a)
1009  return 1;
1010  else
1011  return 0;
1012  }
1013  }
1014  }
1018  template <class U>
1019  inline bool operator<(const Pt2<U>& a) const
1020  {
1021  if (x < a.x)
1022  return 1;
1023  else if (x > a.x)
1024  return 0;
1025  else
1026  {
1027  if (y < a.y)
1028  return 1;
1029  else
1030  return 0;
1031  }
1032  }
1036  template <class U>
1037  inline bool operator<(const Pt3<U>& a) const
1038  {
1039  if (x < a.x)
1040  return 1;
1041  else if (x > a.x)
1042  return 0;
1043  else
1044  {
1045  if (y < a.y)
1046  return 1;
1047  else if (y > a.y)
1048  return 0;
1049  else
1050  {
1051  if (z < a.z)
1052  return 1;
1053  else
1054  return 0;
1055  }
1056  }
1057  }
1061  template <class U>
1062  inline bool operator<(const Pt4<U>& a) const
1063  {
1064  if (x < a.x)
1065  return 1;
1066  else if (x > a.x)
1067  return 0;
1068  else
1069  {
1070  if (y < a.y)
1071  return 1;
1072  else if (y > a.y)
1073  return 0;
1074  else
1075  {
1076  if (z < a.z)
1077  return 1;
1078  else
1079  return 0;
1080  }
1081  }
1082  }
1083 
1087  template <class U>
1088  inline bool operator<=(const U& a) const
1089  {
1090  return (*this < a || *this == a);
1091  }
1095  template <class U>
1096  inline bool operator<=(const Pt2<U>& a) const
1097  {
1098  return (*this < a || *this == a);
1099  }
1103  template <class U>
1104  inline bool operator<=(const Pt3<U>& a) const
1105  {
1106  return (*this < a || *this == a);
1107  }
1111  template <class U>
1112  inline bool operator<=(const Pt4<U>& a) const
1113  {
1114  return (*this < a || *this == a);
1115  }
1116 
1120  template <class U>
1121  inline bool operator>(const U& a) const
1122  {
1123  return !(*this <= a);
1124  }
1128  template <class U>
1129  inline bool operator>(const Pt2<U>& a) const
1130  {
1131  return !(*this <= a);
1132  }
1136  template <class U>
1137  inline bool operator>(const Pt3<U>& a) const
1138  {
1139  return !(*this <= a);
1140  }
1144  template <class U>
1145  inline bool operator>(const Pt4<U>& a) const
1146  {
1147  return !(*this <= a);
1148  }
1149 
1153  template <class U>
1154  inline bool operator>=(const U& a) const
1155  {
1156  return (*this > a || *this == a);
1157  }
1161  template <class U>
1162  inline bool operator>=(const Pt2<U>& a) const
1163  {
1164  return (*this > a || *this == a);
1165  }
1169  template <class U>
1170  inline bool operator>=(const Pt3<U>& a) const
1171  {
1172  return (*this > a || *this == a);
1173  }
1177  template <class U>
1178  inline bool operator>=(const Pt4<U>& a) const
1179  {
1180  return (*this > a || *this == a);
1181  }
1182 
1183  // Arithmetic operators
1184 
1188  template <class U>
1189  inline Pt3 operator+(const U& a) const // Pt3 + int (etc)
1190  {
1191  return Pt3((T)(x + a), (T)(y + a), (T)(z + a));
1192  }
1196  template <class U>
1197  inline Pt3 operator+(const Pt2<U>& a) const // Pt3 + Pt2
1198  {
1199  return Pt3((T)(x + a.x), (T)(y + a.y), z);
1200  }
1204  template <class U>
1205  inline Pt3 operator+(const Pt3<U>& a) const // Pt3 + Pt3
1206  {
1207  return Pt3((T)(x + a.x), (T)(y + a.y), (T)(z + a.z));
1208  }
1212  template <class U>
1213  inline Pt3 operator+(const Pt4<U>& a) const // Pt3 + Pt4
1214  {
1215  return Pt3((T)(x + a.x), (T)(y + a.y), (T)(z + a.z));
1216  }
1217 
1221  template <class U>
1222  inline Pt3 operator-(const U& a) const // Pt3 - int (etc)
1223  {
1224  return Pt3((T)(x - a), (T)(y - a), (T)(z - a));
1225  }
1229  template <class U>
1230  inline Pt3 operator-(const Pt2<U>& a) const // Pt3 - Pt2
1231  {
1232  return Pt3((T)(x - a.x), (T)(y - a.y), z);
1233  }
1237  template <class U>
1238  inline Pt3 operator-(const Pt3<U>& a) const // Pt3 - Pt3
1239  {
1240  return Pt3((T)(x - a.x), (T)(y - a.y), (T)(z - a.z));
1241  }
1245  template <class U>
1246  inline Pt3 operator-(const Pt4<U>& a) const // Pt3 - Pt4
1247  {
1248  return Pt3((T)(x - a.x), (T)(y - a.y), (T)(z - a.z));
1249  }
1250 
1253  inline Pt3 operator-() const // -Pt3
1254  {
1255  return Pt3((T)(-x), (T)(-y), (T)(-z));
1256  }
1257 
1261  template <class U>
1262  inline Pt3 operator*(const U& a) const // Pt3 * int (etc)
1263  {
1264  return Pt3((T)(x * a), (T)(y * a), (T)(z * a));
1265  }
1269  template <class U>
1270  inline Pt3 operator*(const Pt2<U>& a) const // Pt3 * Pt2
1271  {
1272  return Pt3((T)(x * a.x), (T)(y * a.y), z);
1273  }
1277  template <class U>
1278  inline Pt3 operator*(const Pt3<U>& a) const // Pt3 * Pt3
1279  {
1280  return Pt3((T)(x * a.x), (T)(y * a.y), (T)(z * a.z));
1281  }
1285  template <class U>
1286  inline Pt3 operator*(const Pt4<U>& a) const // Pt3 * Pt4
1287  {
1288  return Pt3((T)(x * a.x), (T)(y * a.y), (T)(z * a.z));
1289  }
1290 
1294  template <class U>
1295  inline Pt3 operator/(const U& a) const // Pt3 / int (etc)
1296  {
1297  return Pt3((T)(x / a), (T)(y / a), (T)(z / a));
1298  }
1302  template <class U>
1303  inline Pt3 operator/(const Pt2<U>& a) const // Pt3 / Pt2
1304  {
1305  return Pt3((T)(x / a.x), (T)(y / a.y), z);
1306  }
1310  template <class U>
1311  inline Pt3 operator/(const Pt3<U>& a) const // Pt3 / Pt3
1312  {
1313  return Pt3((T)(x / a.x), (T)(y / a.y), (T)(z / a.z));
1314  }
1318  template <class U>
1319  inline Pt3 operator/(const Pt4<U>& a) const // Pt3 / Pt4
1320  {
1321  return Pt3((T)(x / a.x), (T)(y / a.y), (T)(z / a.z));
1322  }
1323 
1326  template <class U>
1327  inline void operator+=(const U& a) // Pt3 += int (etc)
1328  {
1329  x = (T)(x + a);
1330  y = (T)(y + a);
1331  z = (T)(z + a);
1332  }
1335  template <class U>
1336  inline void operator+=(const Pt2<U>& a) // Pt3 += Pt2
1337  {
1338  x = (T)(x + a.x);
1339  y = (T)(y + a.y);
1340  }
1343  template <class U>
1344  inline void operator+=(const Pt3<U>& a) // Pt3 += Pt3
1345  {
1346  x = (T)(x + a.x);
1347  y = (T)(y + a.y);
1348  z = (T)(z + a.z);
1349  }
1352  template <class U>
1353  inline void operator+=(const Pt4<U>& a) // Pt3 += Pt4
1354  {
1355  x = (T)(x + a.x);
1356  y = (T)(y + a.y);
1357  z = (T)(z + a.z);
1358  }
1359 
1362  template <class U>
1363  inline void operator-=(const U& a) // Pt3 -= int (etc)
1364  {
1365  x = (T)(x - a);
1366  y = (T)(y - a);
1367  z = (T)(z - a);
1368  }
1371  template <class U>
1372  inline void operator-=(const Pt2<U>& a) // Pt3 -= Pt2
1373  {
1374  x = (T)(x - a.x);
1375  y = (T)(y - a.y);
1376  }
1379  template <class U>
1380  inline void operator-=(const Pt3<U>& a) // Pt3 -= Pt3
1381  {
1382  x = (T)(x - a.x);
1383  y = (T)(y - a.y);
1384  z = (T)(z - a.z);
1385  }
1388  template <class U>
1389  inline void operator-=(const Pt4<U>& a) // Pt3 -= Pt4
1390  {
1391  x = (T)(x - a.x);
1392  y = (T)(y - a.y);
1393  z = (T)(z - a.z);
1394  }
1395 
1398  template <class U>
1399  inline void operator*=(const U& a) // Pt3 *= int (etc)
1400  {
1401  x = (T)(x * a);
1402  y = (T)(y * a);
1403  z = (T)(z * a);
1404  }
1407  template <class U>
1408  inline void operator*=(const Pt2<U>& a) // Pt3 *= Pt2
1409  {
1410  x = (T)(x * a.x);
1411  y = (T)(y * a.y);
1412  }
1415  template <class U>
1416  inline void operator*=(const Pt3<U>& a) // Pt3 *= Pt3
1417  {
1418  x = (T)(x * a.x);
1419  y = (T)(y * a.y);
1420  z = (T)(z * a.z);
1421  }
1424  template <class U>
1425  inline void operator*=(const Pt4<U>& a) // Pt3 *= Pt4
1426  {
1427  x = (T)(x * a.x);
1428  y = (T)(y * a.y);
1429  z = (T)(z * a.z);
1430  }
1431 
1434  template <class U>
1435  inline void operator/=(const U& a) // Pt3 /= int (etc)
1436  {
1437  x = (T)(x / a);
1438  y = (T)(y / a);
1439  z = (T)(z / a);
1440  }
1443  template <class U>
1444  inline void operator/=(const Pt2<U>& a) // Pt3 /= Pt2
1445  {
1446  x = (T)(x / a.x);
1447  y = (T)(y / a.y);
1448  }
1451  template <class U>
1452  inline void operator/=(const Pt3<U>& a) // Pt3 /= Pt3
1453  {
1454  x = (T)(x / a.x);
1455  y = (T)(y / a.y);
1456  z = (T)(z / a.z);
1457  }
1460  template <class U>
1461  inline void operator/=(const Pt4<U>& a) // Pt3 /= Pt4
1462  {
1463  x = (T)(x / a.x);
1464  y = (T)(y / a.y);
1465  z = (T)(z / a.z);
1466  }
1467 
1468  // Other stuff
1469 
1474  void Set(T a_x, T a_y, T a_z)
1475  {
1476  x = a_x;
1477  y = a_y;
1478  z = a_z;
1479  }
1482  void Set(T a)
1483  {
1484  x = a;
1485  y = a;
1486  z = a;
1487  }
1488 
1492  T operator[](unsigned int a) const { return *(&x + a); }
1496  T& operator[](unsigned int a) { return *(&x + a); }
1497 
1501  const T& at(unsigned int a) const
1502  {
1503  switch (a)
1504  {
1505  case 0:
1506  return x;
1507  case 1:
1508  return y;
1509  case 2:
1510  return z;
1511  default:
1512  throw std::out_of_range("Pt3<T>::at(): error out of range");
1513  }
1514  }
1518  T& at(unsigned int a) // non-const version
1519  {
1520  // Use the const version. See Effective C++ 3rd Edition Item 3.
1521  return const_cast<T&>(static_cast<const Pt3<T>&>(*this).at(a));
1522  }
1523 
1524  // Typedefs
1525 
1526  typedef T value_type;
1527 
1531  template <typename Archive>
1532  void serialize(Archive& archive, const unsigned int version)
1533  {
1534  (void)version; // For doxygen which couldn't handle commenting it out.
1535  archive& x;
1536  archive& y;
1537  archive& z;
1538  }
1539 
1540 }; // Pt3
1541 
1546 template <class T>
1547 inline Pt3<T> operator*(int a, const Pt3<T>& pt)
1548 {
1549  return (pt * a);
1550 }
1551 
1556 template <class T>
1557 inline Pt3<T> operator*(float a, const Pt3<T>& pt)
1558 {
1559  return (pt * a);
1560 }
1561 
1566 template <class T>
1567 inline Pt3<T> operator*(double a, const Pt3<T>& pt)
1568 {
1569  return (pt * a);
1570 }
1571 
1575 template <class T>
1576 class Pt4
1577 {
1578  // friend std::ostream& operator<<(std::ostream&, const Pt4&);
1579 public:
1580  // Member variables
1581 
1582  T x;
1583  T y;
1584  T z;
1585  T w;
1586 
1587  // Constructors
1588 
1590  : x((T)0)
1591  , y((T)0)
1592  , z((T)0)
1593  , w((T)0)
1594  {
1595  }
1596  Pt4(T a_x, T a_y, T a_z, T a_w)
1602  : x(a_x)
1603  , y(a_y)
1604  , z(a_z)
1605  , w(a_w)
1606  {
1607  }
1610  explicit Pt4(T a)
1611  : x(a)
1612  , y(a)
1613  , z(a)
1614  , w(a)
1615  {
1616  }
1617  // (single arg ctors should be explicit)
1618 
1621  Pt4(const Pt4& a)
1622  : x(a.x)
1623  , y(a.y)
1624  , z(a.z)
1625  , w(a.w)
1626  {
1627  }
1628 
1629  // constructors for conversions (all explicit)
1632  template <class U>
1633  explicit Pt4(const Pt2<U>& a)
1634  : x((T)a.x)
1635  , y((T)a.y)
1636  , z((T)0)
1637  , w((T)0)
1638  {
1639  }
1642  template <class U>
1643  explicit Pt4(const Pt3<U>& a)
1644  : x((T)a.x)
1645  , y((T)a.y)
1646  , z((T)a.z)
1647  , w((T)0)
1648  {
1649  }
1652  template <class U>
1653  explicit Pt4(const Pt4<U>& a)
1654  : x((T)a.x)
1655  , y((T)a.y)
1656  , z((T)a.z)
1657  , w((T)a.w)
1658  {
1659  }
1660 
1661  ~Pt4() {}
1662 
1666  template <class U>
1667  inline const Pt4& operator=(const U& a)
1668  {
1669  x = (T)a;
1670  y = (T)a;
1671  z = (T)a;
1672  w = (T)a;
1673  return *this;
1674  }
1678  template <class U>
1679  inline const Pt4& operator=(const Pt2<U>& a)
1680  {
1681  x = (T)a.x;
1682  y = (T)a.y;
1683  return *this;
1684  }
1688  template <class U>
1689  inline const Pt4& operator=(const Pt3<U>& a)
1690  {
1691  x = (T)a.x;
1692  y = (T)a.y;
1693  z = (T)a.z;
1694  return *this;
1695  }
1699  template <class U>
1700  inline const Pt4& operator=(const Pt4<U>& a)
1701  {
1702  x = (T)a.x;
1703  y = (T)a.y;
1704  z = (T)a.z;
1705  w = (T)a.w;
1706  return *this;
1707  }
1708 
1709  // Logical operators
1710 
1714  template <class U>
1715  inline bool operator==(const U& a) const
1716  {
1717  return (x == a && y == a && z == a && w == a);
1718  }
1722  template <class U>
1723  inline bool operator==(const Pt2<U>& a) const
1724  {
1725  return (x == a.x && y == a.y);
1726  }
1730  template <class U>
1731  inline bool operator==(const Pt3<U>& a) const
1732  {
1733  return (x == a.x && y == a.y && z == a.z);
1734  }
1738  template <class U>
1739  inline bool operator==(const Pt4<U>& a) const
1740  {
1741  return (x == a.x && y == a.y && z == a.z && w == a.w);
1742  }
1743 
1747  template <class U>
1748  inline bool operator!=(const U& a) const
1749  {
1750  return !(*this == a);
1751  }
1755  template <class U>
1756  inline bool operator!=(const Pt2<U>& a) const
1757  {
1758  return !(*this == a);
1759  }
1763  template <class U>
1764  inline bool operator!=(const Pt3<U>& a) const
1765  {
1766  return !(*this == a);
1767  }
1771  template <class U>
1772  inline bool operator!=(const Pt4<U>& a) const
1773  {
1774  return !(*this == a);
1775  }
1776 
1780  template <class U>
1781  inline bool operator<(const U& a) const
1782  {
1783  if (x < a)
1784  return 1;
1785  else if (x > a)
1786  return 0;
1787  else
1788  {
1789  if (y < a)
1790  return 1;
1791  else if (y > a)
1792  return 0;
1793  else
1794  {
1795  if (z < a)
1796  return 1;
1797  else if (z < a)
1798  return 0;
1799  else
1800  {
1801  if (w < a)
1802  return 1;
1803  else
1804  return 0;
1805  }
1806  }
1807  }
1808  }
1812  template <class U>
1813  inline bool operator<(const Pt2<U>& a) const
1814  {
1815  if (x < a.x)
1816  return 1;
1817  else if (x > a.x)
1818  return 0;
1819  else
1820  {
1821  if (y < a.y)
1822  return 1;
1823  else
1824  return 0;
1825  }
1826  }
1830  template <class U>
1831  inline bool operator<(const Pt3<U>& a) const
1832  {
1833  if (x < a.x)
1834  return 1;
1835  else if (x > a.x)
1836  return 0;
1837  else
1838  {
1839  if (y < a.y)
1840  return 1;
1841  else if (y > a.y)
1842  return 0;
1843  else
1844  {
1845  if (z < a.z)
1846  return 1;
1847  else
1848  return 0;
1849  }
1850  }
1851  }
1855  template <class U>
1856  inline bool operator<(const Pt4<U>& a) const
1857  {
1858  if (x < a.x)
1859  return 1;
1860  else if (x > a.x)
1861  return 0;
1862  else
1863  {
1864  if (y < a.y)
1865  return 1;
1866  else if (y > a.y)
1867  return 0;
1868  else
1869  {
1870  if (z < a.z)
1871  return 1;
1872  else if (z < a.z)
1873  return 0;
1874  else
1875  {
1876  if (w < a.w)
1877  return 1;
1878  else
1879  return 0;
1880  }
1881  }
1882  }
1883  }
1884 
1888  template <class U>
1889  inline bool operator<=(const U& a) const
1890  {
1891  return (*this < a || *this == a);
1892  }
1896  template <class U>
1897  inline bool operator<=(const Pt2<U>& a) const
1898  {
1899  return (*this < a || *this == a);
1900  }
1904  template <class U>
1905  inline bool operator<=(const Pt3<U>& a) const
1906  {
1907  return (*this < a || *this == a);
1908  }
1912  template <class U>
1913  inline bool operator<=(const Pt4<U>& a) const
1914  {
1915  return (*this < a || *this == a);
1916  }
1917 
1921  template <class U>
1922  inline bool operator>(const U& a) const
1923  {
1924  return !(*this <= a);
1925  }
1929  template <class U>
1930  inline bool operator>(const Pt2<U>& a) const
1931  {
1932  return !(*this <= a);
1933  }
1937  template <class U>
1938  inline bool operator>(const Pt3<U>& a) const
1939  {
1940  return !(*this <= a);
1941  }
1945  template <class U>
1946  inline bool operator>(const Pt4<U>& a) const
1947  {
1948  return !(*this <= a);
1949  }
1950 
1954  template <class U>
1955  inline bool operator>=(const U& a) const
1956  {
1957  return (*this > a || *this == a);
1958  }
1962  template <class U>
1963  inline bool operator>=(const Pt2<U>& a) const
1964  {
1965  return (*this > a || *this == a);
1966  }
1970  template <class U>
1971  inline bool operator>=(const Pt3<U>& a) const
1972  {
1973  return (*this > a || *this == a);
1974  }
1978  template <class U>
1979  inline bool operator>=(const Pt4<U>& a) const
1980  {
1981  return (*this > a || *this == a);
1982  }
1983 
1984  // Arithmetic operators
1985 
1989  template <class U>
1990  inline Pt4 operator+(const U& a) const // Pt4 + int (etc)
1991  {
1992  return Pt4((T)(x + a), (T)(y + a), (T)(z + a), (T)(w + a));
1993  }
1997  template <class U>
1998  inline Pt4 operator+(const Pt2<U>& a) const // Pt4 + Pt2
1999  {
2000  return Pt4((T)(x + a.x), (T)(y + a.y), z, w);
2001  }
2005  template <class U>
2006  inline Pt4 operator+(const Pt3<U>& a) const // Pt4 + Pt3
2007  {
2008  return Pt4((T)(x + a.x), (T)(y + a.y), (T)(z + a.z), w);
2009  }
2013  template <class U>
2014  inline Pt4 operator+(const Pt4<U>& a) const // Pt4 + Pt4
2015  {
2016  return Pt4((T)(x + a.x), (T)(y + a.y), (T)(z + a.z), (T)(w + a.w));
2017  }
2018 
2022  template <class U>
2023  inline Pt4 operator-(const U& a) const // Pt4 - int (etc)
2024  {
2025  return Pt4((T)(x - a), (T)(y - a), (T)(z - a), (T)(w - a));
2026  }
2030  template <class U>
2031  inline Pt4 operator-(const Pt2<U>& a) const // Pt4 - Pt2
2032  {
2033  return Pt4((T)(x - a.x), (T)(y - a.y), z, w);
2034  }
2038  template <class U>
2039  inline Pt4 operator-(const Pt3<U>& a) const // Pt4 - Pt3
2040  {
2041  return Pt4((T)(x - a.x), (T)(y - a.y), (T)(z - a.z), w);
2042  }
2046  template <class U>
2047  inline Pt4 operator-(const Pt4<U>& a) const // Pt4 - Pt4
2048  {
2049  return Pt4((T)(x - a.x), (T)(y - a.y), (T)(z - a.z), (T)(w - a.w));
2050  }
2051 
2054  inline Pt4 operator-() const // -Pt4
2055  {
2056  return Pt4((T)(-x), (T)(-y), (T)(-z), (T)(-w));
2057  }
2058 
2062  template <class U>
2063  inline Pt4 operator*(const U& a) const // Pt4 * int (etc)
2064  {
2065  return Pt4((T)(x * a), (T)(y * a), (T)(z * a), (T)(w * a));
2066  }
2070  template <class U>
2071  inline Pt4 operator*(const Pt2<U>& a) const // Pt4 * Pt2
2072  {
2073  return Pt4((T)(x * a.x), (T)(y * a.y), z, w);
2074  }
2078  template <class U>
2079  inline Pt4 operator*(const Pt3<U>& a) const // Pt4 * Pt3
2080  {
2081  return Pt4((T)(x * a.x), (T)(y * a.y), (T)(z * a.z), w);
2082  }
2086  template <class U>
2087  inline Pt4 operator*(const Pt4<U>& a) const // Pt4 * Pt4
2088  {
2089  return Pt4((T)(x * a.x), (T)(y * a.y), (T)(z * a.z), (T)(w * a.w));
2090  }
2091 
2095  template <class U>
2096  inline Pt4 operator/(const U& a) const // Pt4 / int (etc)
2097  {
2098  return Pt4((T)(x / a), (T)(y / a), (T)(z / a), (T)(w / a));
2099  }
2103  template <class U>
2104  inline Pt4 operator/(const Pt2<U>& a) const // Pt4 / Pt2
2105  {
2106  return Pt4((T)(x / a.x), (T)(y / a.y), z, w);
2107  }
2111  template <class U>
2112  inline Pt4 operator/(const Pt3<U>& a) const // Pt4 / Pt3
2113  {
2114  return Pt4((T)(x / a.x), (T)(y / a.y), (T)(z / a.z), w);
2115  }
2119  template <class U>
2120  inline Pt4 operator/(const Pt4<U>& a) const // Pt4 / Pt4
2121  {
2122  return Pt4((T)(x / a.x), (T)(y / a.y), (T)(z / a.z), (T)(w / a.w));
2123  }
2124 
2127  template <class U>
2128  inline void operator+=(const U& a) // Pt4 += int (etc)
2129  {
2130  x = (T)(x + a);
2131  y = (T)(y + a);
2132  z = (T)(z + a);
2133  w = (T)(w + a);
2134  }
2137  template <class U>
2138  inline void operator+=(const Pt2<U>& a) // Pt4 += Pt2
2139  {
2140  x = (T)(x + a.x);
2141  y = (T)(y + a.y);
2142  }
2145  template <class U>
2146  inline void operator+=(const Pt3<U>& a) // Pt4 += Pt3
2147  {
2148  x = (T)(x + a.x);
2149  y = (T)(y + a.y);
2150  z = (T)(z + a.z);
2151  }
2154  template <class U>
2155  inline void operator+=(const Pt4<U>& a) // Pt4 += Pt4
2156  {
2157  x = (T)(x + a.x);
2158  y = (T)(y + a.y);
2159  z = (T)(z + a.z);
2160  w = (T)(w + a.w);
2161  }
2162 
2165  template <class U>
2166  inline void operator-=(const U& a) // Pt4 -= int (etc)
2167  {
2168  x = (T)(x - a);
2169  y = (T)(y - a);
2170  z = (T)(z - a);
2171  w = (T)(w - a);
2172  }
2175  template <class U>
2176  inline void operator-=(const Pt2<U>& a) // Pt4 -= Pt2
2177  {
2178  x = (T)(x - a.x);
2179  y = (T)(y - a.y);
2180  }
2183  template <class U>
2184  inline void operator-=(const Pt3<U>& a) // Pt4 -= Pt3
2185  {
2186  x = (T)(x - a.x);
2187  y = (T)(y - a.y);
2188  z = (T)(z - a.z);
2189  }
2192  template <class U>
2193  inline void operator-=(const Pt4<U>& a) // Pt4 -= Pt4
2194  {
2195  x = (T)(x - a.x);
2196  y = (T)(y - a.y);
2197  z = (T)(z - a.z);
2198  w = (T)(w - a.w);
2199  }
2200 
2203  template <class U>
2204  inline void operator*=(const U& a) // Pt4 *= int (etc)
2205  {
2206  x = (T)(x * a);
2207  y = (T)(y * a);
2208  z = (T)(z * a);
2209  w = (T)(w * a);
2210  }
2213  template <class U>
2214  inline void operator*=(const Pt2<U>& a) // Pt4 *= Pt2
2215  {
2216  x = (T)(x * a.x);
2217  y = (T)(y * a.y);
2218  }
2221  template <class U>
2222  inline void operator*=(const Pt3<U>& a) // Pt4 *= Pt3
2223  {
2224  x = (T)(x * a.x);
2225  y = (T)(y * a.y);
2226  z = (T)(z * a.z);
2227  }
2230  template <class U>
2231  inline void operator*=(const Pt4<U>& a) // Pt4 *= Pt4
2232  {
2233  x = (T)(x * a.x);
2234  y = (T)(y * a.y);
2235  z = (T)(z * a.z);
2236  w = (T)(w * a.w);
2237  }
2238 
2241  template <class U>
2242  inline void operator/=(const U& a) // Pt4 /= int (etc)
2243  {
2244  x = (T)(x / a);
2245  y = (T)(y / a);
2246  z = (T)(z / a);
2247  w = (T)(w / a);
2248  }
2251  template <class U>
2252  inline void operator/=(const Pt2<U>& a) // Pt4 /= Pt2
2253  {
2254  x = (T)(x / a.x);
2255  y = (T)(y / a.y);
2256  }
2259  template <class U>
2260  inline void operator/=(const Pt3<U>& a) // Pt4 /= Pt3
2261  {
2262  x = (T)(x / a.x);
2263  y = (T)(y / a.y);
2264  z = (T)(z / a.z);
2265  }
2268  template <class U>
2269  inline void operator/=(const Pt4<U>& a) // Pt4 /= Pt4
2270  {
2271  x = (T)(x / a.x);
2272  y = (T)(y / a.y);
2273  z = (T)(z / a.z);
2274  w = (T)(w / a.w);
2275  }
2276 
2277  // Other stuff
2278 
2284  void Set(T a_x, T a_y, T a_z, T a_w)
2285  {
2286  x = a_x;
2287  y = a_y;
2288  z = a_z;
2289  w = a_w;
2290  }
2293  void Set(T a)
2294  {
2295  x = a;
2296  y = a;
2297  z = a;
2298  w = a;
2299  }
2300 
2304  T operator[](unsigned int a) const { return *(&x + a); }
2308  T& operator[](unsigned int a) { return *(&x + a); }
2309 
2313  const T& at(unsigned int a) const
2314  {
2315  switch (a)
2316  {
2317  case 0:
2318  return x;
2319  case 1:
2320  return y;
2321  case 2:
2322  return z;
2323  case 3:
2324  return w;
2325  default:
2326  throw std::out_of_range("Pt4<T>::at(): error out of range");
2327  }
2328  }
2332  T& at(unsigned int a) // non-const version
2333  {
2334  // Use the const version. See Effective C++ 3rd Edition Item 3.
2335  return const_cast<T&>(static_cast<const Pt4<T>&>(*this).at(a));
2336  }
2337 
2341  template <typename Archive>
2342  void serialize(Archive& archive, const unsigned int version)
2343  {
2344  (void)version; // For doxygen which couldn't handle commenting it out.
2345  archive& x;
2346  archive& y;
2347  archive& z;
2348  archive& w;
2349  }
2350 
2351 }; // Pt4
2352 
2353 //------------------------------------------------------------------------------
2358 //------------------------------------------------------------------------------
2359 template <class _From, class _To>
2360 _To& Pt3Convert(const _From& a_from, _To& a_to)
2361 {
2362  a_to.x = static_cast<const typename _To::value_type>(a_from.x);
2363  a_to.y = static_cast<const typename _To::value_type>(a_from.y);
2364  a_to.z = static_cast<const typename _To::value_type>(a_from.z);
2365  return a_to;
2366 }; // PtConvert
2367 
2369 // Stream I/O
2371 
2372 //
2373 // This code ported by GMS from "The Standard C++ Library" by Nicolai M.
2374 // Josuttis
2375 //
2376 
2377 //------------------------------------------------------------------------------
2378 // Pt2<T>
2379 
2380 //------------------------------------------------------------------------------
2385 //------------------------------------------------------------------------------
2386 template <typename T, typename charT, typename traits>
2387 inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& strm,
2388  const Pt2<T>& a_pt)
2389 {
2390  // string stream
2391  // - with same format
2392  // - without special field width
2393  std::basic_ostringstream<charT, traits> s;
2394  s.copyfmt(strm);
2395  s.width(0);
2396 
2397  // fill string stream
2398  s << a_pt.x << "," << a_pt.y;
2399 
2400  // print string stream
2401  strm << s.str();
2402 
2403  return strm;
2404 } // operator<< for Pt2<T>
2405 //------------------------------------------------------------------------------
2410 //------------------------------------------------------------------------------
2411 template <typename T, typename charT, typename traits>
2412 inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& strm,
2413  Pt2<T>& a_pt)
2414 {
2415  T x, y;
2416 
2417  // read x
2418  strm >> x;
2419 
2420  // if available
2421  // - read ',' and y value
2422  if (strm.peek() == ',')
2423  {
2424  strm.ignore();
2425  strm >> y;
2426  }
2427  else
2428  {
2429  y = static_cast<T>(0);
2430  }
2431 
2432  if (strm)
2433  {
2434  a_pt = Pt2<T>(x, y);
2435  }
2436 
2437  return strm;
2438 } // operator>> for Pt2<T>
2439 
2440 //------------------------------------------------------------------------------
2441 // Pt3<T>
2442 
2443 //------------------------------------------------------------------------------
2448 //------------------------------------------------------------------------------
2449 template <typename T, typename charT, typename traits>
2450 inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& strm,
2451  const Pt3<T>& a_pt)
2452 {
2453  // string stream
2454  // - with same format
2455  // - without special field width
2456  std::basic_ostringstream<charT, traits> s;
2457  s.copyfmt(strm);
2458  s.width(0);
2459 
2460  // fill string stream
2461  s << a_pt.x << "," << a_pt.y << "," << a_pt.z;
2462 
2463  // print string stream
2464  strm << s.str();
2465 
2466  return strm;
2467 } // operator<< for Pt3<T>
2468 //------------------------------------------------------------------------------
2473 //------------------------------------------------------------------------------
2474 template <typename T, typename charT, typename traits>
2475 inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& strm,
2476  Pt3<T>& a_pt)
2477 {
2478  T x, y, z;
2479 
2480  // read x
2481  strm >> x;
2482 
2483  // if available
2484  // - read ',' and y and z values
2485  if (strm.peek() == ',')
2486  {
2487  strm.ignore();
2488  strm >> y;
2489  if (strm.peek() == ',')
2490  {
2491  strm.ignore();
2492  strm >> z;
2493  }
2494  else
2495  {
2496  z = static_cast<T>(0);
2497  }
2498  }
2499  else
2500  {
2501  y = static_cast<T>(0);
2502  z = static_cast<T>(0);
2503  }
2504 
2505  if (strm)
2506  {
2507  a_pt = Pt3<T>(x, y, z);
2508  }
2509 
2510  return strm;
2511 } // operator>> for Pt3<T>
2512 
2513 //------------------------------------------------------------------------------
2514 // Pt4<T>
2515 
2516 //------------------------------------------------------------------------------
2521 //------------------------------------------------------------------------------
2522 template <typename T, typename charT, typename traits>
2523 inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& strm,
2524  const Pt4<T>& a_pt)
2525 {
2526  // string stream
2527  // - with same format
2528  // - without special field width
2529  std::basic_ostringstream<charT, traits> s;
2530  s.copyfmt(strm);
2531  s.width(0);
2532 
2533  // fill string stream
2534  s << a_pt.x << "," << a_pt.y << "," << a_pt.z << "," << a_pt.w;
2535 
2536  // print string stream
2537  strm << s.str();
2538 
2539  return strm;
2540 } // operator<< for Pt4<T>
2541 //------------------------------------------------------------------------------
2546 //------------------------------------------------------------------------------
2547 template <typename T, typename charT, typename traits>
2548 inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& strm,
2549  Pt4<T>& a_pt)
2550 {
2551  T x, y, z, w;
2552 
2553  // read x
2554  strm >> x;
2555 
2556  // if available
2557  // - read ',' and y and z values
2558  if (strm.peek() == ',')
2559  {
2560  strm.ignore();
2561  strm >> y;
2562  if (strm.peek() == ',')
2563  {
2564  strm.ignore();
2565  strm >> z;
2566  if (strm.peek() == ',')
2567  {
2568  strm.ignore();
2569  strm >> w;
2570  }
2571  else
2572  {
2573  w = static_cast<T>(0);
2574  }
2575  }
2576  else
2577  {
2578  z = static_cast<T>(0);
2579  w = static_cast<T>(0);
2580  }
2581  }
2582  else
2583  {
2584  y = static_cast<T>(0);
2585  z = static_cast<T>(0);
2586  w = static_cast<T>(0);
2587  }
2588 
2589  if (strm)
2590  {
2591  a_pt = Pt4<T>(x, y, z, w);
2592  }
2593 
2594  return strm;
2595 } // operator>> for Pt4<T>
2596 
2597 } // namespace xms
bool operator==(const U &a) const
Definition: pt.h:1715
void operator*=(const Pt2< U > &a)
Definition: pt.h:2214
void serialize(Archive &archive, const unsigned int version)
For serialization.
Definition: pt.h:1532
Pt2 operator+(const Pt3< U > &a) const
Definition: pt.h:456
T z
z coordinate
Definition: pt.h:799
bool operator>=(const U &a) const
Definition: pt.h:1955
const T & at(unsigned int a) const
Definition: pt.h:1501
bool operator==(const Pt3< U > &a) const
Definition: pt.h:216
Pt2(const Pt2 &a)
copy construcor
Definition: pt.h:117
void operator+=(const Pt3< U > &a)
Definition: pt.h:1344
bool operator>(const U &a) const
Definition: pt.h:1121
void operator-=(const Pt3< U > &a)
Definition: pt.h:2184
bool operator>=(const Pt2< U > &a) const
Definition: pt.h:1162
T & at(unsigned int a)
Definition: pt.h:768
void operator*=(const Pt2< U > &a)
Definition: pt.h:662
Include this small header instead of pt.h.
const Pt2 & operator=(const Pt4< U > &a)
Definition: pt.h:187
Pt4 operator+(const U &a) const
Definition: pt.h:1990
void operator-=(const U &a)
Definition: pt.h:1363
T z
z coordinate
Definition: pt.h:1584
void operator/=(const Pt2< U > &a)
Definition: pt.h:1444
Pt3 operator-() const
Definition: pt.h:1253
bool operator>(const Pt4< U > &a) const
Definition: pt.h:1145
void serialize(Archive &archive, const unsigned int version)
For serialization.
Definition: pt.h:778
Pt2 operator*(const Pt2< U > &a) const
Definition: pt.h:521
Pt2 operator+(const Pt2< U > &a) const
Definition: pt.h:448
bool operator!=(const U &a) const
Definition: pt.h:1748
bool operator>(const U &a) const
Definition: pt.h:372
Pt3 operator+(const Pt3< U > &a) const
Definition: pt.h:1205
Pt4 operator+(const Pt2< U > &a) const
Definition: pt.h:1998
Pt4 operator*(const Pt3< U > &a) const
Definition: pt.h:2079
void operator/=(const U &a)
Definition: pt.h:2242
bool operator==(const U &a) const
Definition: pt.h:928
Pt4 operator/(const U &a) const
Definition: pt.h:2096
Pt4 operator*(const Pt4< U > &a) const
Definition: pt.h:2087
Pt4(const Pt2< U > &a)
constructor. (Pt4<T>) Pt2<U>
Definition: pt.h:1633
T & operator[](unsigned int a)
Definition: pt.h:748
T & at(unsigned int a)
Definition: pt.h:2332
const T & at(unsigned int a) const
Definition: pt.h:2313
bool operator!=(const U &a) const
Definition: pt.h:233
bool operator==(const Pt4< U > &a) const
Definition: pt.h:224
void Set(T a_x, T a_y, T a_z, T a_w)
Definition: pt.h:2284
Pt2 operator-(const U &a) const
Definition: pt.h:473
T x
x coordinate
Definition: pt.h:797
void Set(T a)
Definition: pt.h:735
Pt2 operator+(const Pt4< U > &a) const
Definition: pt.h:464
bool operator<(const U &a) const
Definition: pt.h:1781
Pt4 operator/(const Pt2< U > &a) const
Definition: pt.h:2104
const T & at(unsigned int a) const
Definition: pt.h:753
bool operator!=(const Pt2< U > &a) const
Definition: pt.h:969
Pt4(const Pt4< U > &a)
constructor. (Pt4<T>) Pt4<U>
Definition: pt.h:1653
Pt4 operator-(const U &a) const
Definition: pt.h:2023
Pt4 operator-(const Pt3< U > &a) const
Definition: pt.h:2039
void operator-=(const Pt3< U > &a)
Definition: pt.h:634
void operator+=(const Pt3< U > &a)
Definition: pt.h:2146
bool operator<(const U &a) const
Definition: pt.h:994
void operator-=(const Pt2< U > &a)
Definition: pt.h:2176
void serialize(Archive &archive, const unsigned int version)
For serialization.
Definition: pt.h:2342
bool operator>(const Pt4< U > &a) const
Definition: pt.h:1946
T & at(unsigned int a)
Definition: pt.h:1518
Pt4 operator*(const U &a) const
Definition: pt.h:2063
void operator/=(const Pt4< U > &a)
Definition: pt.h:717
const Pt4 & operator=(const Pt2< U > &a)
Definition: pt.h:1679
Pt3 operator*(const Pt4< U > &a) const
Definition: pt.h:1286
Pt4 operator+(const Pt4< U > &a) const
Definition: pt.h:2014
T operator[](unsigned int a) const
Definition: pt.h:2304
T x
x coordinate
Definition: pt.h:88
Pt2 operator*(const Pt3< U > &a) const
Definition: pt.h:529
bool operator!=(const Pt2< U > &a) const
Definition: pt.h:1756
bool operator>(const Pt4< U > &a) const
Definition: pt.h:396
const Pt2 & operator=(const U &a)
Definition: pt.h:157
bool operator==(const Pt4< U > &a) const
Definition: pt.h:952
bool operator>(const U &a) const
Definition: pt.h:1922
Pt2 operator-(const Pt2< U > &a) const
Definition: pt.h:481
void operator+=(const Pt3< U > &a)
Definition: pt.h:597
Pt4 operator-() const
Definition: pt.h:2054
void operator*=(const U &a)
Definition: pt.h:1399
Pt2 operator/(const Pt4< U > &a) const
Definition: pt.h:570
void operator/=(const Pt4< U > &a)
Definition: pt.h:2269
Pt4(const Pt3< U > &a)
constructor. (Pt4<T>) Pt3<U>
Definition: pt.h:1643
void operator/=(const Pt2< U > &a)
Definition: pt.h:2252
void operator*=(const Pt4< U > &a)
Definition: pt.h:2231
void operator+=(const Pt2< U > &a)
Definition: pt.h:588
void operator-=(const Pt2< U > &a)
Definition: pt.h:625
void operator/=(const U &a)
Definition: pt.h:690
T w
w coordinate
Definition: pt.h:1585
void operator*=(const Pt3< U > &a)
Definition: pt.h:2222
void operator+=(const Pt2< U > &a)
Definition: pt.h:1336
void operator+=(const Pt4< U > &a)
Definition: pt.h:1353
Pt2(const Pt2< U > &a)
constructor.
Definition: pt.h:127
void operator*=(const Pt4< U > &a)
Definition: pt.h:1425
Pt2 operator*(const Pt4< U > &a) const
Definition: pt.h:537
bool operator==(const Pt2< U > &a) const
Definition: pt.h:936
void operator*=(const Pt3< U > &a)
Definition: pt.h:1416
T x
x coordinate
Definition: pt.h:1582
void operator/=(const U &a)
Definition: pt.h:1435
Pt4 operator-(const Pt4< U > &a) const
Definition: pt.h:2047
bool operator<=(const U &a) const
Definition: pt.h:1088
Pt2 operator/(const U &a) const
Definition: pt.h:546
Pt3 operator/(const Pt3< U > &a) const
Definition: pt.h:1311
bool operator>=(const Pt4< U > &a) const
Definition: pt.h:1178
Pt4 operator-(const Pt2< U > &a) const
Definition: pt.h:2031
~Pt2()
destructor. can&#39;t be virtual
Definition: pt.h:151
Pt3 operator*(const Pt2< U > &a) const
Definition: pt.h:1270
void Set(T a)
Definition: pt.h:2293
Pt4(T a)
constructor
Definition: pt.h:1610
bool operator>(const Pt3< U > &a) const
Definition: pt.h:388
const Pt3 & operator=(const Pt4< U > &a)
Definition: pt.h:914
Pt3(T a)
constructor
Definition: pt.h:830
bool operator!=(const Pt3< U > &a) const
Definition: pt.h:977
bool operator!=(const Pt3< U > &a) const
Definition: pt.h:1764
Pt2()
Definition: pt.h:93
void operator-=(const U &a)
Definition: pt.h:2166
void operator+=(const Pt4< U > &a)
Definition: pt.h:2155
void operator-=(const U &a)
Definition: pt.h:616
Pt4 operator/(const Pt4< U > &a) const
Definition: pt.h:2120
Pt3(const Pt4< U > &a)
constructor.
Definition: pt.h:869
bool operator==(const U &a) const
Definition: pt.h:200
void operator-=(const Pt2< U > &a)
Definition: pt.h:1372
bool operator<(const U &a) const
Definition: pt.h:266
~Pt4()
Destructor. can&#39;t be virtual.
Definition: pt.h:1661
void operator/=(const Pt3< U > &a)
Definition: pt.h:708
void operator-=(const Pt3< U > &a)
Definition: pt.h:1380
void Set(T a_x, T a_y)
Definition: pt.h:728
bool operator>=(const Pt3< U > &a) const
Definition: pt.h:421
bool operator>=(const Pt2< U > &a) const
Definition: pt.h:1963
bool operator==(const Pt3< U > &a) const
Definition: pt.h:1731
void operator*=(const Pt4< U > &a)
Definition: pt.h:680
Pt2 operator/(const Pt3< U > &a) const
Definition: pt.h:562
const Pt3 & operator=(const U &a)
Definition: pt.h:882
Pt4 operator/(const Pt3< U > &a) const
Definition: pt.h:2112
2D Point template class
Definition: pt.h:82
void operator*=(const Pt2< U > &a)
Definition: pt.h:1408
bool operator!=(const Pt4< U > &a) const
Definition: pt.h:985
bool operator>(const Pt3< U > &a) const
Definition: pt.h:1137
bool operator>=(const Pt3< U > &a) const
Definition: pt.h:1170
void operator/=(const Pt2< U > &a)
Definition: pt.h:699
void operator+=(const U &a)
Definition: pt.h:579
Pt3 operator/(const Pt2< U > &a) const
Definition: pt.h:1303
bool operator!=(const Pt3< U > &a) const
Definition: pt.h:249
bool operator<=(const U &a) const
Definition: pt.h:339
Pt4 operator+(const Pt3< U > &a) const
Definition: pt.h:2006
const Pt2 & operator=(const Pt3< U > &a)
Definition: pt.h:177
void operator+=(const U &a)
Definition: pt.h:2128
bool operator>=(const Pt3< U > &a) const
Definition: pt.h:1971
bool operator>(const Pt2< U > &a) const
Definition: pt.h:1129
~Pt3()
destructor. can&#39;t be virtual
Definition: pt.h:876
void Set(T a_x, T a_y, T a_z)
Definition: pt.h:1474
bool operator>=(const U &a) const
Definition: pt.h:405
bool operator>(const Pt3< U > &a) const
Definition: pt.h:1938
void operator*=(const U &a)
Definition: pt.h:2204
3d point template class
Definition: pt.h:791
T y
y coordinate
Definition: pt.h:89
void Set(T a)
Definition: pt.h:1482
Pt3 operator-(const Pt4< U > &a) const
Definition: pt.h:1246
T operator[](unsigned int a) const
Definition: pt.h:744
bool operator<=(const U &a) const
Definition: pt.h:1889
Pt4(const Pt4 &a)
Definition: pt.h:1621
Pt3()
Definition: pt.h:803
bool operator>=(const Pt4< U > &a) const
Definition: pt.h:1979
bool operator>(const Pt2< U > &a) const
Definition: pt.h:1930
Pt3 operator-(const U &a) const
Definition: pt.h:1222
void operator*=(const U &a)
Definition: pt.h:653
Pt2(const Pt3< U > &a)
constructor.
Definition: pt.h:135
T y
y coordinate
Definition: pt.h:798
void operator-=(const Pt4< U > &a)
Definition: pt.h:2193
void operator+=(const U &a)
Definition: pt.h:1327
void operator-=(const Pt4< U > &a)
Definition: pt.h:643
void operator/=(const Pt3< U > &a)
Definition: pt.h:2260
const Pt4 & operator=(const U &a)
Definition: pt.h:1667
Pt3(const Pt3 &a)
Definition: pt.h:840
bool operator>=(const Pt4< U > &a) const
Definition: pt.h:429
Pt2 operator+(const U &a) const
Definition: pt.h:440
const Pt4 & operator=(const Pt3< U > &a)
Definition: pt.h:1689
Pt2 operator-(const Pt4< U > &a) const
Definition: pt.h:497
bool operator==(const Pt2< U > &a) const
Definition: pt.h:208
Pt3 operator*(const U &a) const
Definition: pt.h:1262
bool operator!=(const U &a) const
Definition: pt.h:961
T value_type
value_type
Definition: pt.h:1526
Pt3(const Pt3< U > &a)
constructor.
Definition: pt.h:860
_To & Pt3Convert(const _From &a_from, _To &a_to)
Convert from one Pt3 to another.
Definition: pt.h:2360
void operator/=(const Pt3< U > &a)
Definition: pt.h:1452
T y
y coordinate
Definition: pt.h:1583
Pt3(const Pt2< U > &a)
constructor. Z is set to 0
Definition: pt.h:851
T operator[](unsigned int a) const
Definition: pt.h:1492
Pt3 operator-(const Pt2< U > &a) const
Definition: pt.h:1230
bool operator==(const Pt2< U > &a) const
Definition: pt.h:1723
T & operator[](unsigned int a)
Definition: pt.h:1496
Pt2 operator*(const U &a) const
Definition: pt.h:513
T & operator[](unsigned int a)
Definition: pt.h:2308
bool operator!=(const Pt4< U > &a) const
Definition: pt.h:257
Pt2 operator-() const
Definition: pt.h:504
void operator+=(const Pt2< U > &a)
Definition: pt.h:2138
Pt3 operator*(const Pt3< U > &a) const
Definition: pt.h:1278
4D point template class
Definition: pt.h:1576
bool operator==(const Pt3< U > &a) const
Definition: pt.h:944
const Pt2 & operator=(const Pt2< U > &a)
Definition: pt.h:167
Pt2(const Pt4< U > &a)
constructor.
Definition: pt.h:143
bool operator>(const Pt2< U > &a) const
Definition: pt.h:380
const Pt4 & operator=(const Pt4< U > &a)
Definition: pt.h:1700
void operator/=(const Pt4< U > &a)
Definition: pt.h:1461
bool operator==(const Pt4< U > &a) const
Definition: pt.h:1739
bool operator>=(const U &a) const
Definition: pt.h:1154
Pt3(T a_x, T a_y)
constructor. Z is set to 0.0.
Definition: pt.h:822
void operator*=(const Pt3< U > &a)
Definition: pt.h:671
Pt2(const T &a)
constructor
Definition: pt.h:108
const Pt3 & operator=(const Pt3< U > &a)
Definition: pt.h:903
Pt2 operator-(const Pt3< U > &a) const
Definition: pt.h:489
Pt2 operator/(const Pt2< U > &a) const
Definition: pt.h:554
Pt3 operator+(const Pt4< U > &a) const
Definition: pt.h:1213
Pt3 operator/(const Pt4< U > &a) const
Definition: pt.h:1319
Pt3 operator+(const Pt2< U > &a) const
Definition: pt.h:1197
Pt3 operator-(const Pt3< U > &a) const
Definition: pt.h:1238
const Pt3 & operator=(const Pt2< U > &a)
Definition: pt.h:893
Pt3 operator/(const U &a) const
Definition: pt.h:1295
void operator+=(const Pt4< U > &a)
Definition: pt.h:606
std::basic_istream< charT, traits > & operator>>(std::basic_istream< charT, traits > &strm, Pt2< T > &a_pt)
operator>>
Definition: pt.h:2412
bool operator!=(const Pt4< U > &a) const
Definition: pt.h:1772
Pt4 operator*(const Pt2< U > &a) const
Definition: pt.h:2071
bool operator!=(const Pt2< U > &a) const
Definition: pt.h:241
Pt3 operator+(const U &a) const
Definition: pt.h:1189
bool operator>=(const Pt2< U > &a) const
Definition: pt.h:413
void operator-=(const Pt4< U > &a)
Definition: pt.h:1389
Pt4()
Definition: pt.h:1589