encoding.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: encoding.h,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/21 16:01:07  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*
  10. Copyright (c) 2002 Anatoliy Kuznetsov.
  11. Permission is hereby granted, free of charge, to any person 
  12. obtaining a copy of this software and associated documentation 
  13. files (the "Software"), to deal in the Software without restriction, 
  14. including without limitation the rights to use, copy, modify, merge, 
  15. publish, distribute, sublicense, and/or sell copies of the Software, 
  16. and to permit persons to whom the Software is furnished to do so, 
  17. subject to the following conditions:
  18. The above copyright notice and this permission notice shall be included 
  19. in all copies or substantial portions of the Software.
  20. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
  21. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
  22. OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
  23. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
  24. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
  25. ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
  26. OTHER DEALINGS IN THE SOFTWARE.
  27. */
  28. #ifndef ENCODING_H__INCLUDED__
  29. #define ENCODING_H__INCLUDED__
  30. #include <memory.h>
  31. namespace bm
  32. {
  33. // ----------------------------------------------------------------
  34. /*!
  35.    brief Memory encoding.
  36.    
  37.    Class for encoding data into memory. 
  38.    Properly handles aligment issues with integer data types.
  39. */
  40. class encoder
  41. {
  42. public:
  43.     encoder(unsigned char* buf, unsigned size);
  44.     void put_8(unsigned char c);
  45.     void put_16(bm::short_t s);
  46.     void put_32(bm::word_t  w);
  47.     void memcpy(const void* mem, unsigned size);
  48.     unsigned size() const;
  49. private:
  50.     unsigned char*  buf_;
  51.     unsigned char*  start_;
  52.     unsigned int    size_;
  53. };
  54. // ----------------------------------------------------------------
  55. /**
  56.    Class for decoding data from memory buffer.
  57.    Properly handles aligment issues with integer data types.
  58. */
  59. class decoder
  60. {
  61. public:
  62.     decoder(const unsigned char* buf);
  63.     unsigned char get_8();
  64.     bm::short_t get_16();
  65.     bm::word_t get_32();
  66.     void memcpy(void* mem, unsigned size);
  67.     unsigned size() const;
  68. private:
  69.    const unsigned char*   buf_;
  70.    const unsigned char*   start_;
  71. };
  72. // ----------------------------------------------------------------
  73. // Implementation details. 
  74. // ----------------------------------------------------------------
  75. /*! 
  76.     fn encoder::encoder(unsigned char* buf, unsigned size) 
  77.     brief Construction.
  78.     param buf - memory buffer pointer.
  79.     param size - size of the buffer
  80. */
  81. inline encoder::encoder(unsigned char* buf, unsigned size)
  82. : buf_(buf), start_(buf), size_(size)
  83. {
  84. }
  85. /*!
  86.    fn void encoder::put_8(unsigned char c) 
  87.    brief Puts one character into the encoding buffer.
  88.    param c - character to encode
  89. */
  90. inline void encoder::put_8(unsigned char c)
  91. {
  92.     *buf_++ = c;
  93. }
  94. /*!
  95.    fn encoder::put_16(bm::short_t s)
  96.    brief Puts short word (16 bits) into the encoding buffer.
  97.    param s - short word to encode
  98. */
  99. inline void encoder::put_16(bm::short_t s)
  100. {
  101.     *buf_++ = (unsigned char) s;
  102.     s >>= 8;
  103.     *buf_++ = (unsigned char) s;
  104. }
  105. /*!
  106.    fn unsigned encoder::size() const
  107.    brief Returns size of the current encoding stream.
  108. */
  109. inline unsigned encoder::size() const
  110. {
  111.     return (unsigned)(buf_ - start_);
  112. }
  113. /*!
  114.    fn void encoder::put_32(bm::word_t w)
  115.    brief Puts 32 bits word into encoding buffer.
  116.    param w - word to encode.
  117. */
  118. inline void encoder::put_32(bm::word_t w)
  119. {
  120.     *buf_++ = (unsigned char) w;
  121.     *buf_++ = (unsigned char) (w >> 8);
  122.     *buf_++ = (unsigned char) (w >> 16);
  123.     *buf_++ = (unsigned char) (w >> 24);
  124. }
  125. /*!
  126.    fn encoder::memcpy(const void* mem, unsigned size)
  127.    brief Puts block of memory into encoding buffer.
  128.    param mem - pointer on memory to encode.
  129.    param size - size of the memory block.
  130. */
  131. inline void encoder::memcpy(const void* mem, unsigned size)
  132. {
  133.    ::memcpy(buf_, mem, size);
  134.    buf_ += size;
  135. }
  136. // ---------------------------------------------------------------------
  137. /*!
  138.    fn decoder::decoder(const unsigned char* buf) 
  139.    brief Construction
  140.    param buf - pointer to the decoding memory. 
  141. */
  142. inline decoder::decoder(const unsigned char* buf) 
  143. : buf_(buf), start_(buf)
  144. {
  145. }
  146. /*!
  147.    fn unsigned char decoder::get_8()  
  148.    brief Reads character from the decoding buffer.
  149. */
  150. inline unsigned char decoder::get_8() 
  151. {
  152.     return *buf_++;
  153. }
  154. /*!
  155.    fn bm::short_t decoder::get_16()
  156.    brief Reads 16bit word from the decoding buffer.
  157. */
  158. inline bm::short_t decoder::get_16() 
  159. {
  160.     bm::short_t a = (bm::short_t)(buf_[0] + ((bm::short_t)buf_[1] << 8));
  161.     buf_ += sizeof(a);
  162.     return a;
  163. }
  164. /*!
  165.    fn bm::word_t decoder::get_32()
  166.    brief Reads 32 bit word from the decoding buffer.
  167. */
  168. inline bm::word_t decoder::get_32() 
  169. {
  170.     bm::word_t a = buf_[0]+ ((unsigned)buf_[1] << 8) +
  171.                    ((unsigned)buf_[2] << 16) + ((unsigned)buf_[3] << 24);
  172.     buf_+=sizeof(a);
  173.     return a;
  174. }
  175. /*!
  176.    fn void decoder::memcpy(void* mem, unsigned size) 
  177.    brief Reads block of memory from the decoding buffer.
  178.    param mem - pointer on memory block to read into.
  179.    param size - size of memory block in bytes.
  180. */
  181. inline void decoder::memcpy(void* mem, unsigned size) 
  182. {
  183.    ::memcpy(mem, buf_, size);
  184.    buf_ += size;
  185. }
  186. /*!
  187.    fn unsigned decoder::size() const
  188.    brief Returns size of the current decoding stream.
  189. */
  190. inline unsigned decoder::size() const
  191. {
  192.     return (unsigned)(buf_ - start_);
  193. }
  194. } // namespace bm
  195. #endif