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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llioutil.h
  3.  * @author Phoenix
  4.  * @date 2005-10-05
  5.  * @brief Helper classes for dealing with IOPipes
  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_LLIOUTIL_H
  35. #define LL_LLIOUTIL_H
  36. #include "llbuffer.h"
  37. #include "lliopipe.h"
  38. #include "llpumpio.h"
  39. /** 
  40.  * @class LLIOFlush
  41.  * @brief This class is used as a mini chain head which drains the buffer.
  42.  * @see LLIOPipe
  43.  *
  44.  * An instance of this class acts as a useful chain head when all data
  45.  * is known, and you simply want to get the chain moving.
  46.  */
  47. class LLIOFlush : public LLIOPipe
  48. {
  49. public:
  50. LLIOFlush() {}
  51. virtual ~LLIOFlush() {}
  52. protected:
  53. /* @name LLIOPipe virtual implementations
  54.  */
  55. //@{
  56. /** 
  57.  * @brief Process the data in buffer
  58.  */
  59. EStatus process_impl(
  60. const LLChannelDescriptors& channels,
  61. buffer_ptr_t& buffer,
  62. bool& eos,
  63. LLSD& context,
  64. LLPumpIO* pump);
  65. //@}
  66. protected:
  67. };
  68. /** 
  69.  * @class LLIOSleep
  70.  * @brief This is a simple helper class which will hold a chain and
  71.  * process it later using pump mechanisms
  72.  * @see LLIOPipe
  73.  */
  74. class LLIOSleep : public LLIOPipe
  75. {
  76. public:
  77. LLIOSleep(F64 sleep_seconds) : mSeconds(sleep_seconds) {}
  78. virtual ~LLIOSleep() {}
  79. protected:
  80. /* @name LLIOPipe virtual implementations
  81.  */
  82. //@{
  83. /** 
  84.  * @brief Process the data in buffer
  85.  */
  86. EStatus process_impl(
  87. const LLChannelDescriptors& channels,
  88. buffer_ptr_t& buffer,
  89. bool& eos,
  90. LLSD& context,
  91. LLPumpIO* pump);
  92. //@}
  93. protected:
  94. F64 mSeconds;
  95. };
  96. /** 
  97.  * @class LLIOAddChain
  98.  * @brief Simple pipe that just adds a chain to a pump.
  99.  * @see LLIOPipe
  100.  */
  101. class LLIOAddChain : public LLIOPipe
  102. {
  103. public:
  104. LLIOAddChain(const LLPumpIO::chain_t& chain, F32 timeout) :
  105. mChain(chain),
  106. mTimeout(timeout)
  107. {}
  108. virtual ~LLIOAddChain() {}
  109. protected:
  110. /* @name LLIOPipe virtual implementations
  111.  */
  112. //@{
  113. /** 
  114.  * @brief Process the data in buffer
  115.  */
  116. EStatus process_impl(
  117. const LLChannelDescriptors& channels,
  118. buffer_ptr_t& buffer,
  119. bool& eos,
  120. LLSD& context,
  121. LLPumpIO* pump);
  122. //@}
  123. protected:
  124. LLPumpIO::chain_t mChain;
  125. F32 mTimeout;
  126. };
  127. /** 
  128.  * @class LLChangeChannel
  129.  * @brief This class changes the channel of segments in the buffer
  130.  * @see LLBufferArray
  131.  *
  132.  * This class is useful for iterating over the segments in a buffer
  133.  * array and changing each channel that matches to a different
  134.  * channel.
  135.  * Example:
  136.  * <code>
  137.  * set_in_to_out(LLChannelDescriptors channels, LLBufferArray* buf)
  138.  * {
  139.  *   std::for_each(
  140.  *     buf->beginSegment(),
  141.  *     buf->endSegment(),
  142.  *     LLChangeChannel(channels.in(), channels.out()));
  143.  * }
  144.  * </code>
  145.  */
  146. class LLChangeChannel //: public unary_function<T, void>
  147. {
  148. public:
  149. /** 
  150.  * @brief Constructor for iterating over a segment range to change channel.
  151.  *
  152.  * @param is The channel to match when looking at a segment.
  153.  * @param becomes The channel to set the segment when a match is found.
  154.  */
  155. LLChangeChannel(S32 is, S32 becomes);
  156. /** 
  157.  * @brief Do the work of changing the channel
  158.  */
  159. void operator()(LLSegment& segment);
  160. protected:
  161. S32 mIs;
  162. S32 mBecomes;
  163. };
  164. #endif // LL_LLIOUTIL_H