llbufferstream.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llbufferstream.h
  3.  * @author Phoenix
  4.  * @date 2005-10-10
  5.  * @brief Classes to treat an LLBufferArray as a c++ iostream.
  6.  *
  7.  * $LicenseInfo:firstyear=2005&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2005-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #ifndef LL_LLBUFFERSTREAM_H
  35. #define LL_LLBUFFERSTREAM_H
  36. #include <iosfwd>
  37. #include <iostream>
  38. #include "llbuffer.h"
  39. /** 
  40.  * @class LLBufferStreamBuf
  41.  * @brief This implements the buffer wrapper for an istream
  42.  *
  43.  * The buffer array passed in is not owned by the stream buf object.
  44.  */
  45. class LLBufferStreamBuf : public std::streambuf
  46. {
  47. public:
  48. LLBufferStreamBuf(
  49. const LLChannelDescriptors& channels,
  50. LLBufferArray* buffer);
  51. virtual ~LLBufferStreamBuf();
  52. protected:
  53. #if( LL_WINDOWS || __GNUC__ > 2 )
  54. typedef std::streambuf::pos_type pos_type;
  55. typedef std::streambuf::off_type off_type;
  56. #endif
  57. /* @name streambuf vrtual implementations
  58.  */
  59. //@{
  60. /*
  61.  * @brief called when we hit the end of input
  62.  *
  63.  * @return Returns the character at the current position or EOF.
  64.  */
  65. virtual int underflow();
  66. /*
  67.  * @brief called when we hit the end of output
  68.  *
  69.  * @param c The character to store at the current put position
  70.  * @return Returns EOF if the function failed. Any other value on success.
  71.  */
  72. virtual int overflow(int c);
  73. /*
  74.  * @brief synchronize the buffer
  75.  *
  76.  * @return Returns 0 on success or -1 on failure.
  77.  */
  78. virtual int sync();
  79. /*
  80.  * @brief Seek to an offset position in a stream.
  81.  *
  82.  * @param off Offset value relative to way paramter
  83.  * @param way The seek direction. One of ios::beg, ios::cur, and ios::end.
  84.  * @param which Which pointer to modify. One of ios::in, ios::out,
  85.  * or both masked together.
  86.  * @return Returns the new position or an invalid position on failure.
  87.  */
  88. #if( LL_WINDOWS || __GNUC__ > 2)
  89. virtual pos_type seekoff(
  90. off_type off,
  91. std::ios::seekdir way,
  92. std::ios::openmode which);
  93. #else
  94. virtual streampos seekoff(
  95. streamoff off,
  96. std::ios::seekdir way,
  97. std::ios::openmode which);
  98. #endif
  99. /*
  100.  * @brief Get s sequence of characters from the input
  101.  *
  102.  * @param dst Pointer to a block of memory to accept the characters
  103.  * @param length Number of characters to be read
  104.  * @return Returns the number of characters read
  105.  */
  106. //virtual streamsize xsgetn(char* dst, streamsize length);
  107. /*
  108.  * @brief Write some characters to output
  109.  *
  110.  * @param src Pointer to a sequence of characters to be output
  111.  * @param length Number of characters to be put
  112.  * @return Returns the number of characters written
  113.  */
  114. //virtual streamsize xsputn(char* src, streamsize length);
  115. //@}
  116. protected:
  117. // This channels we are working on.
  118. LLChannelDescriptors mChannels;
  119. // The buffer we work on
  120. LLBufferArray* mBuffer;
  121. };
  122. /** 
  123.  * @class LLBufferStream
  124.  * @brief This implements an istream based wrapper around an LLBufferArray.
  125.  *
  126.  * This class does not own the buffer array, and does not hold a
  127.  * shared pointer to it. Since the class itself is fairly ligthweight,
  128.  * just make one on the stack when needed and let it fall out of
  129.  * scope.
  130.  */
  131. class LLBufferStream : public std::iostream
  132. {
  133. public:
  134. LLBufferStream(
  135. const LLChannelDescriptors& channels,
  136. LLBufferArray* buffer);
  137. ~LLBufferStream();
  138. protected:
  139. LLBufferStreamBuf mStreamBuf;
  140. };
  141. #endif // LL_LLBUFFERSTREAM_H