github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/rawp/librawp/src/snappy/rawp-snappy-sinksource.h (about)

     1  // Copyright 2011 Google Inc. All Rights Reserved.
     2  //
     3  // Redistribution and use in source and binary forms, with or without
     4  // modification, are permitted provided that the following conditions are
     5  // met:
     6  //
     7  //     * Redistributions of source code must retain the above copyright
     8  // notice, this list of conditions and the following disclaimer.
     9  //     * Redistributions in binary form must reproduce the above
    10  // copyright notice, this list of conditions and the following disclaimer
    11  // in the documentation and/or other materials provided with the
    12  // distribution.
    13  //     * Neither the name of Google Inc. nor the names of its
    14  // contributors may be used to endorse or promote products derived from
    15  // this software without specific prior written permission.
    16  //
    17  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    18  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    19  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    20  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    21  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    22  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    23  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    24  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    25  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    26  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    27  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    28  
    29  #ifndef RAWP_SNAPPY_SINKSOURCE_H_
    30  #define RAWP_SNAPPY_SINKSOURCE_H_
    31  
    32  #include <stddef.h>
    33  
    34  
    35  namespace rawp {
    36  namespace snappy {
    37  
    38  // A Sink is an interface that consumes a sequence of bytes.
    39  class Sink {
    40   public:
    41    Sink() { }
    42    virtual ~Sink();
    43  
    44    // Append "bytes[0,n-1]" to this.
    45    virtual void Append(const char* bytes, size_t n) = 0;
    46  
    47    // Returns a writable buffer of the specified length for appending.
    48    // May return a pointer to the caller-owned scratch buffer which
    49    // must have at least the indicated length.  The returned buffer is
    50    // only valid until the next operation on this Sink.
    51    //
    52    // After writing at most "length" bytes, call Append() with the
    53    // pointer returned from this function and the number of bytes
    54    // written.  Many Append() implementations will avoid copying
    55    // bytes if this function returned an internal buffer.
    56    //
    57    // If a non-scratch buffer is returned, the caller may only pass a
    58    // prefix of it to Append().  That is, it is not correct to pass an
    59    // interior pointer of the returned array to Append().
    60    //
    61    // The default implementation always returns the scratch buffer.
    62    virtual char* GetAppendBuffer(size_t length, char* scratch);
    63  
    64  
    65   private:
    66    // No copying
    67    Sink(const Sink&);
    68    void operator=(const Sink&);
    69  };
    70  
    71  // A Source is an interface that yields a sequence of bytes
    72  class Source {
    73   public:
    74    Source() { }
    75    virtual ~Source();
    76  
    77    // Return the number of bytes left to read from the source
    78    virtual size_t Available() const = 0;
    79  
    80    // Peek at the next flat region of the source.  Does not reposition
    81    // the source.  The returned region is empty iff Available()==0.
    82    //
    83    // Returns a pointer to the beginning of the region and store its
    84    // length in *len.
    85    //
    86    // The returned region is valid until the next call to Skip() or
    87    // until this object is destroyed, whichever occurs first.
    88    //
    89    // The returned region may be larger than Available() (for example
    90    // if this ByteSource is a view on a substring of a larger source).
    91    // The caller is responsible for ensuring that it only reads the
    92    // Available() bytes.
    93    virtual const char* Peek(size_t* len) = 0;
    94  
    95    // Skip the next n bytes.  Invalidates any buffer returned by
    96    // a previous call to Peek().
    97    // REQUIRES: Available() >= n
    98    virtual void Skip(size_t n) = 0;
    99  
   100   private:
   101    // No copying
   102    Source(const Source&);
   103    void operator=(const Source&);
   104  };
   105  
   106  // A Source implementation that yields the contents of a flat array
   107  class ByteArraySource : public Source {
   108   public:
   109    ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { }
   110    virtual ~ByteArraySource();
   111    virtual size_t Available() const;
   112    virtual const char* Peek(size_t* len);
   113    virtual void Skip(size_t n);
   114   private:
   115    const char* ptr_;
   116    size_t left_;
   117  };
   118  
   119  // A Sink implementation that writes to a flat array without any bound checks.
   120  class UncheckedByteArraySink : public Sink {
   121   public:
   122    explicit UncheckedByteArraySink(char* dest) : dest_(dest) { }
   123    virtual ~UncheckedByteArraySink();
   124    virtual void Append(const char* data, size_t n);
   125    virtual char* GetAppendBuffer(size_t len, char* scratch);
   126  
   127    // Return the current output pointer so that a caller can see how
   128    // many bytes were produced.
   129    // Note: this is not a Sink method.
   130    char* CurrentDestination() const { return dest_; }
   131   private:
   132    char* dest_;
   133  };
   134  
   135  }  // namespace snappy
   136  }  // namespace rawp
   137  
   138  #endif  // RAWP_SNAPPY_SINKSOURCE_H_