CopyOnWriteData.hxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef COPY_ON_WRITE_DATA_HXX_
  2. #define COPY_ON_WRITE_DATA_HXX_
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const CopyOnWriteData_hxx_Version =
  53.     "$Id: CopyOnWriteData.hxx,v 1.15 2001/05/28 21:28:34 bko Exp $";
  54. // this code is for defining an assert-like method for enforcing
  55. // singlethreadedness.
  56. #include <cstring>
  57. #include <string>
  58. #include "mstring.hxx"
  59. #include "VException.hxx"
  60. #include "CWBuffer.hxx"
  61. #include "ThreadSafeBuffer.hxx"
  62. #include "DataException.hxx"
  63. #include "limits.h"
  64. // set this to 0 to turn off
  65. #define VOCAL_DEBUG_BAD_USAGE_OF_DATA 0
  66. #if VOCAL_DEBUG_BAD_USAGE_OF_DATA
  67. #include "AssertSingleThreaded.hxx"
  68. #define ASSERT_UNLOCK(x___) x___.unlock()
  69. #define ASSERT_WRITELOCK(x___) x___.writelock()
  70. #define ASSERT_READLOCK(x___) x___.readlock()
  71. #else
  72. #define ASSERT_WRITE(x, SingleThreadAssertable_) ((void) 0)
  73. #define ASSERT_READ(x, SingleThreadAssertable_) ((void) 0)
  74. #define ASSERT_UNLOCK(x___) ((void) 0)
  75. #define ASSERT_WRITELOCK(x___) ((void) 0)
  76. #define ASSERT_READLOCK(x___) ((void) 0)
  77. #endif
  78. /** Class for representing binary data and strings, in a thread-safe
  79.  ** manner.  This version is implemented as copy on write buffers.
  80.  */
  81. class CopyOnWriteData
  82. {
  83.     public:
  84. /// "no position" -- used to indicate non-position when returning a value
  85.         static const int npos = INT_MAX;
  86.         /// Default constructor
  87.         CopyOnWriteData();
  88.         /** constructor for C style strings
  89.  ** @param str      null-terminated (C style) character array
  90.  */
  91.         CopyOnWriteData( const char* str );
  92.         /** constructor for character arrays with length 
  93.  **  @param buffer character array 
  94.  **  @param len    size of buffer
  95.  */
  96.         CopyOnWriteData( const char* buffer, int length );
  97.         /// copy constructor
  98.         CopyOnWriteData( const CopyOnWriteData& data );
  99.         /** constructor for C++ strings
  100.  */
  101.         CopyOnWriteData( const string& str);
  102.         /** constructor for mstring (a specialization of C++ strings)
  103.  */
  104.         CopyOnWriteData( const mstring& mstr);
  105.         /// constructor that converts an int to a Data
  106.         CopyOnWriteData( const int value);
  107.         /// destructor
  108.         ~CopyOnWriteData();
  109.         /** compares two Data objects, returning the value of a
  110.  * dictionary comparison of the two strings
  111.  */
  112.         bool operator>(const CopyOnWriteData& ) const ;
  113.         /** compares two Data objects, returning the value of a
  114.  * dictionary comparison of the two strings
  115.  */
  116.         bool operator<(const CopyOnWriteData& ) const;
  117.         /** compares two Data objects, returning the value of a
  118.  * dictionary comparison of the two strings
  119.  */
  120.         bool operator>(const char* ) const ;
  121.         /** compares two Data objects, returning the value of a
  122.  * dictionary comparison of the two strings
  123.  */
  124.         bool operator<(const char* ) const;
  125.         /** assignment operator
  126.  ** @param str   C string character array
  127.  */
  128.         CopyOnWriteData& operator=(const char* str);
  129.         /** assignment operator
  130.  ** @param data   CopyOnWriteData object
  131.  */
  132.         CopyOnWriteData& operator=(const CopyOnWriteData& data);
  133.         /// returns a NUL terminated (a C string) buffer
  134.         const char* getData() const;
  135.         /** returns a pointer to the buffer.  Note that this buffer is
  136.          ** NOT NUL terminated (not a C string).
  137.  */
  138.         const char* getDataBuf() const;
  139.         /** return one character from the string
  140.  ** @param i   index into the Data object
  141.  */
  142.         char getChar( int i ) const;
  143.         /** return one character from the string
  144.  ** @param i   index into the object
  145.  ** @param c   character to set
  146.  */
  147.         void setchar( int i, char c );
  148.         /** return one character from the string
  149.  ** @param i   index into the object
  150.  */
  151.         char operator[]( int i ) const;
  152.         /// length of the Data object
  153.         int length() const;
  154.         /** suggest a size for the underlying buffer (optimizes
  155.          ** performance in some implementations)
  156.          */
  157.         void setBufferSize(int size);
  158.         /** equality operator
  159.  ** @param str   C string to compare to
  160.  */
  161.         bool operator==( const char* str ) const;
  162.         /** equality operator
  163.  ** @param data   Data to compare to
  164.  */
  165.         bool operator==( const CopyOnWriteData& data ) const;
  166.         /// inequality operator
  167.         bool operator!=( const char* str ) const;
  168.         /// inequality operator
  169.         bool operator!=( const CopyOnWriteData& data ) const;
  170.         /// friend to compare a c-style string to a data (avoids conversion)
  171.         friend bool operator==( const char* str, const CopyOnWriteData& d );
  172.         /// friend to compare a c-style string to a data (avoids conversion)
  173.         friend bool operator!=( const char* str, const CopyOnWriteData& d );
  174.         ///
  175.         int compare(const char* str, int length) const;
  176.         ///
  177.         int compare(const CopyOnWriteData& data) const;
  178.         ///
  179.         int compareNoCase(const char* str, int length) const;
  180.         ///
  181.         int compareNoCase(const CopyOnWriteData& data) const;
  182.         /** concatenate two Data objects together.  Warning -- this
  183.  * creates an extra copy of the Data object, so it is not
  184.  * terribly efficient.  If possible, it is better to use +=
  185.  * instead.
  186.  */
  187.         CopyOnWriteData operator+( const CopyOnWriteData& data) const;
  188.         /** concatenate a Data object and a C-style string together.
  189.  * Warning -- this creates an extra copy of the Data object,
  190.  * so it is not terribly efficient.  If possible, it is better
  191.  * to use += instead.
  192.  */
  193.         CopyOnWriteData operator+( const char* str) const;
  194.         /** append a Data object d to this Data.
  195.  ** this is potentially much more efficient than operator+().
  196.  */
  197.         void operator+=(const CopyOnWriteData& d);
  198.         /** append a string s to this Data.
  199.  ** this is potentially much more efficient than operator+().
  200.  */
  201.         void operator+=(const char*);
  202.         /// erase this object
  203.         void erase();
  204. /// convert Data to uppercase
  205. void lowercase();
  206. /// convert Data to lowercase
  207. void uppercase();
  208.         /// convert to a string
  209.         operator string() const;
  210.         /// convert to a C style character array
  211.         operator const char*() const;
  212.         /// convert to an mstring
  213.         operator mstring() const;
  214.         /// convert to an int (depreciated)
  215.         operator int() const;
  216.         /** match the string and return the text prior to the match.
  217.          *  If a match is found, this Data is set to the remainder
  218.          *  after the matched string.
  219.          *
  220.          *  @param match         the string to be matched
  221.          *  @param beforeMatch   the data before the matched string
  222.          *  @param replace       whether to replace the matched data
  223.          *  @param replaceWith   the data to replace the matched data
  224.          */
  225.         int match(const char* match,
  226.                   CopyOnWriteData* data,
  227.                   bool replace = false,
  228.                   CopyOnWriteData replaceWith = "");
  229. /** 
  230.     match (and eat) the first contiguous block composed of the
  231.     characters in match, which is outside of double quotes <">
  232.     and angle brackets "<" and ">". Returned is the data
  233.     before the matched characters.  If no characters match,
  234.     return the empty Data.  If matchFail is set to a bool ptr,
  235.     the bool *matchFail will be set to true if the match
  236.     fails, and false otherwise.
  237.             This is designed for use in separating a list of
  238.             parameters at the commas (e.g. Contact:)
  239. */
  240. CopyOnWriteData parseOutsideQuotes(const char* match, 
  241.                                            bool useQuote,
  242.                                            bool useAngle,
  243.                                            bool* matchFail = 0 );
  244. /** 
  245.     match (and eat) the first contiguous block composed of the
  246.     characters in match. Returned is the data before the
  247.     matched characters.  If no characters match, return the
  248.     empty Data.  If matchFail is set to a bool ptr, the bool
  249.     *matchFail will be set to true if the match fails, and
  250.     false otherwise.
  251. */
  252. CopyOnWriteData parse(const char* match, bool* matchFail = 0 );
  253. /** match (and eat) any one of the characters in match.  If
  254.     matchedChar points to a char, it will be set to the
  255.     matching character, or  if not matched to anything.
  256.     Returns characters before the match, or the empty string
  257.     if no characters match.
  258. */
  259. CopyOnWriteData matchChar(const char* match, char* matchedChar = 0);
  260. /** get the next line in the text, delimited by rn or n .
  261.     Differs from parse("rn", matchFail) in that if there is
  262.     a blank line (which has the contiguous text rnrn),
  263.     parse will merely skip the empty line, while getLine will
  264.     return the empty line as an empty Data.
  265. */
  266. CopyOnWriteData getLine(bool* matchFail = 0 );
  267.         /// removes spaces before and after a string.
  268.         void removeSpaces();
  269.         /// remove leading white space.
  270.         void removeLWS();
  271.         /// expand expands headers (depreciated)
  272.         void expand(CopyOnWriteData startFrom,
  273.                     CopyOnWriteData findstr,
  274.                     CopyOnWriteData replstr,
  275.                     CopyOnWriteData delimiter);
  276.         /// do a case-insensitive match
  277.         friend bool isEqualNoCase( const CopyOnWriteData& left,
  278.                                    const CopyOnWriteData& right ) ;
  279.         /// do a case-insensitive match
  280.         friend bool isEqualNoCase( const char* left,
  281.                                    const CopyOnWriteData& right ) ;
  282.         /// find a string in the object
  283.         int find( const CopyOnWriteData& match, int start = npos );
  284.         /// find a string in the object
  285.         int find( const char* match, int start = npos );
  286. friend ostream& operator<<(ostream& s, const CopyOnWriteData& data);
  287.     private:
  288.         char getCharInternal( int i ) const;
  289.         void getWritable(int length = 0);
  290.         void truncate(int first, int last);
  291.         void replace(int startpos, int endpos, 
  292.      const CopyOnWriteData& replaceStr);
  293.         string getstring() const;
  294.         CWBuffer data_;
  295.         mutable ThreadSafeBuffer myCdata;
  296. mutable bool changed;
  297. #if VOCAL_DEBUG_BAD_USAGE_OF_DATA
  298.         mutable Vocal::Threads::SingleThreadAssertable myAssertable;
  299. #endif
  300. };
  301. #include "CopyOnWriteData.cxx"
  302. /* Local Variables: */
  303. /* c-file-style: "stroustrup" */
  304. /* indent-tabs-mode: nil */
  305. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  306. /* c-basic-offset: 4 */
  307. /* End: */
  308. #endif