![]() |
![]() |
00001 #ifndef GeometryVector_Point2DBase_h 00002 #define GeometryVector_Point2DBase_h 00003 00004 00005 #include "DataFormats/GeometryVector/interface/PointTag.h" 00006 #include "DataFormats/GeometryVector/interface/PV2DBase.h" 00007 #include "DataFormats/GeometryVector/interface/Vector2DBase.h" 00008 00009 template <class T, class FrameTag> 00010 class Point2DBase : public PV2DBase< T, PointTag, FrameTag> { 00011 public: 00012 00013 typedef PV2DBase< T, PointTag, FrameTag> BaseClass; 00014 typedef Vector2DBase< T, FrameTag> VectorType; 00015 typedef Basic2DVector<T> BasicVectorType; 00016 typedef typename BaseClass::Polar Polar; 00017 00022 Point2DBase() {} 00023 00027 template <class U> 00028 Point2DBase( const Point2DBase<U,FrameTag>& p) : BaseClass( p.basicVector()) {} 00029 00031 Point2DBase(const T& x, const T& y) : BaseClass(x, y) {} 00032 00034 explicit Point2DBase( const Polar& set) : BaseClass( set) {} 00035 00040 template <class U> 00041 explicit Point2DBase( const Basic2DVector<U>& v) : BaseClass(v) {} 00042 00046 template <class U> 00047 Point2DBase& operator+=( const Vector2DBase< U, FrameTag>& v) { 00048 this->basicVector() += v.basicVector(); 00049 return *this; 00050 } 00051 00052 template <class U> 00053 Point2DBase& operator-=( const Vector2DBase< U, FrameTag>& v) { 00054 this->basicVector() -= v.basicVector(); 00055 return *this; 00056 } 00057 00058 }; 00059 00064 template< typename T, typename U, class Frame> 00065 inline Point2DBase< typename PreciseFloatType<T,U>::Type, Frame> 00066 operator+( const Point2DBase<T,Frame>& p, const Vector2DBase<U,Frame>& v) { 00067 typedef Point2DBase< typename PreciseFloatType<T,U>::Type, Frame> RT; 00068 return RT( p.basicVector() + v.basicVector()); 00069 } 00070 00073 template< typename T, typename U, class Frame> 00074 inline Point2DBase< typename PreciseFloatType<T,U>::Type, Frame> 00075 operator+( const Vector2DBase<T,Frame>& p, const Point2DBase<U,Frame>& v) { 00076 typedef Point2DBase< typename PreciseFloatType<T,U>::Type, Frame> RT; 00077 return RT( p.basicVector() + v.basicVector()); 00078 } 00079 00084 template< typename T, typename U, class Frame> 00085 inline Vector2DBase< typename PreciseFloatType<T,U>::Type, Frame> 00086 operator-( const Point2DBase<T,Frame>& p1, const Point2DBase<U,Frame>& p2) { 00087 typedef Vector2DBase< typename PreciseFloatType<T,U>::Type, Frame> RT; 00088 return RT( p1.basicVector() - p2.basicVector()); 00089 } 00090 00091 #endif // GeometryVector_Point2DBase_h