Download | Plain Text | No Line Numbers
- /**
- * @module cdatn
- * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
- * @brief Datatype template and datatype definition for CCPU and CMem
- * @date 26.05.2009
- */
-
- #ifndef CDATN_H
- #define CDATN_H 1
-
- #include <boost/operators.hpp>
- #include <iostream>
-
- /**
- * @class CDatN
- *
- * Datatype template for CCPU and CMem.
- */
- class CDatN
- : public boost::operators<CDatN>
- {
- private:
- /**
- * @method CDatN
- * @brief Default ctor
- * @param -
- * @return -
- * @globalvars none
- * @exception bad_alloc
- * @pre none
- * @post none
- */
- CDatN()
- {}
-
- public:
- /**
- * @method ~CDatN
- * @brief Default dtor
- * @param -
- * @return -
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- virtual ~CDatN()
- {}
-
- /**
- * @method CDatN
- * @brief Copy constructor for CDatN
- * @param other reference to CDatN which will be copied
- * @return -
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN(const CDatN& other)
- : m_value(other.m_value), m_width(other.m_width)
- {}
-
- /**
- * @method CDatN
- * @brief Copy constructor for int
- * @param newval new value for CDatN
- * @param width maximum width
- * @return -
- * @globalvars none
- * @exception std::runtime_error
- * @pre none
- * @post none
- */
- CDatN(const int newval, unsigned width = 31)
- : m_value(((1 << width) - 1) & newval), m_width(width)
- {
- if (width < 2 || width > 32)
- throw std::runtime_error("width must be between 2 and 32");
- }
-
- /**
- * @method getValue
- * @brief returns value of CDatN
- * @param -
- * @return value of CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- int getValue() const
- {
- return m_value;
- }
-
- /**
- * @method operator int
- * @brief convert to int
- * @param -
- * @return int
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- operator int()
- {
- return m_value;
- }
-
- /**
- * @method operator<
- * @brief implementation of operator <
- * @param x reference to CDatN
- * @return true if cdat is less than object x
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- bool operator<(const CDatN& x) const
- {
- return m_value < x.m_value;
- }
-
- /**
- * @method operator==
- * @brief implementation of operator ==
- * @param x reference to CDatN
- * @return true if cdat equals object x
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- bool operator==(const CDatN& x) const
- {
- return m_value == x.m_value;
- }
-
- /**
- * @method operator=
- * @brief implementation of operator =
- * @param newval reference to int
- * @return refecence to int
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN &operator=(const int& newval)
- {
- m_value = ((1 << m_width) - 1) & newval;
- return *this;
- }
-
- /**
- * @method operator+=
- * @brief implementation of operator +=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator+=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value + x.m_value);
- return *this;
- }
-
- /**
- * @method operator-=
- * @brief implementation of operator -=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator-=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value - x.m_value);
- return *this;
- }
-
- /**
- * @method operator*=
- * @brief implementation of operator *=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator*=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value * x.m_value);
- return *this;
- }
-
- /**
- * @method operator/=
- * @brief implementation of operator /=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator/=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value / x.m_value);
- return *this;
- }
-
- /**
- * @method operator%=
- * @brief implementation of operator %=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator%=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value % x.m_value);
- return *this;
- }
-
- /**
- * @method operator|=
- * @brief implementation of operator |=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator|=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value | x.m_value);
- return *this;
- }
-
- /**
- * @method operator&=
- * @brief implementation of operator &=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator&=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value & x.m_value);
- return *this;
- }
-
- /**
- * @method operator^=
- * @brief implementation of operator ^=
- * @param x reference to CDatN
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator^=(const CDatN& x)
- {
- m_value = ((1 << m_width) - 1) & (m_value ^ x.m_value);
- return *this;
- }
-
- /**
- * @method operator++
- * @brief implementation of operator ++
- * @param -
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator++()
- {
- m_value = ((1 << m_width) - 1) & (m_value + 1);
- return *this;
- }
-
- /**
- * @method operator--
- * @brief implementation of operator --
- * @param -
- * @return refecence to CDatN
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CDatN& operator--()
- {
- m_value--;
- return *this;
- }
-
- /**
- * @method operator<<
- * @brief Shift/output operator for outputstream
- * @param stream reference to outputstream
- * @param cdat object which will be printed to stream
- * @return reference to outputstream
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- friend std::ostream& operator<<(std::ostream& stream, CDatN cdat)
- {
- stream << cdat.m_value;
- return stream;
- }
-
- /**
- * @method operator>>
- * @brief Shift/read operator for inputstream
- * @param stream reference to inputstream
- * @param cdat reference to object which will be read from stream
- * @return reference to inputstream
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- friend std::istream& operator>>(std::istream & stream, CDatN& cdat)
- {
- stream >> cdat.m_value;
- cdat.m_value = ((1 << cdat.m_width) - 1) & cdat.m_value;
- return stream;
- }
-
- protected:
- /* members */
- /** internal value of datatype */
- int m_value;
- /** width of datatype */
- unsigned m_width;
- };
-
- #endif
-
- /* vim: set et sw=2 ts=2: */
-