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

     1  // Copyright 2005 and onwards Google Inc.
     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  // A light-weight compression algorithm.  It is designed for speed of
    30  // compression and decompression, rather than for the utmost in space
    31  // savings.
    32  //
    33  // For getting better compression ratios when you are compressing data
    34  // with long repeated sequences or compressing data that is similar to
    35  // other data, while still compressing fast, you might look at first
    36  // using BMDiff and then compressing the output of BMDiff with
    37  // Snappy.
    38  
    39  #ifndef RAWP_SNAPPY_H__
    40  #define RAWP_SNAPPY_H__
    41  
    42  #include <stddef.h>
    43  #include <string>
    44  
    45  #include "rawp-snappy-stubs-public.h"
    46  
    47  namespace rawp {
    48  namespace snappy {
    49    class Source;
    50    class Sink;
    51  
    52    // ------------------------------------------------------------------------
    53    // Generic compression/decompression routines.
    54    // ------------------------------------------------------------------------
    55  
    56    // Compress the bytes read from "*source" and append to "*sink". Return the
    57    // number of bytes written.
    58    size_t Compress(Source* source, Sink* sink);
    59  
    60    // Find the uncompressed length of the given stream, as given by the header.
    61    // Note that the true length could deviate from this; the stream could e.g.
    62    // be truncated.
    63    //
    64    // Also note that this leaves "*source" in a state that is unsuitable for
    65    // further operations, such as RawUncompress(). You will need to rewind
    66    // or recreate the source yourself before attempting any further calls.
    67    bool GetUncompressedLength(Source* source, uint32* result);
    68  
    69    // ------------------------------------------------------------------------
    70    // Higher-level string based routines (should be sufficient for most users)
    71    // ------------------------------------------------------------------------
    72  
    73    // Sets "*output" to the compressed version of "input[0,input_length-1]".
    74    // Original contents of *output are lost.
    75    //
    76    // REQUIRES: "input[]" is not an alias of "*output".
    77    size_t Compress(const char* input, size_t input_length, string* output);
    78  
    79    // Decompresses "compressed[0,compressed_length-1]" to "*uncompressed".
    80    // Original contents of "*uncompressed" are lost.
    81    //
    82    // REQUIRES: "compressed[]" is not an alias of "*uncompressed".
    83    //
    84    // returns false if the message is corrupted and could not be decompressed
    85    bool Uncompress(const char* compressed, size_t compressed_length,
    86                    string* uncompressed);
    87  
    88  
    89    // ------------------------------------------------------------------------
    90    // Lower-level character array based routines.  May be useful for
    91    // efficiency reasons in certain circumstances.
    92    // ------------------------------------------------------------------------
    93  
    94    // REQUIRES: "compressed" must point to an area of memory that is at
    95    // least "MaxCompressedLength(input_length)" bytes in length.
    96    //
    97    // Takes the data stored in "input[0..input_length]" and stores
    98    // it in the array pointed to by "compressed".
    99    //
   100    // "*compressed_length" is set to the length of the compressed output.
   101    //
   102    // Example:
   103    //    char* output = new char[snappy::MaxCompressedLength(input_length)];
   104    //    size_t output_length;
   105    //    RawCompress(input, input_length, output, &output_length);
   106    //    ... Process(output, output_length) ...
   107    //    delete [] output;
   108    void RawCompress(const char* input,
   109                     size_t input_length,
   110                     char* compressed,
   111                     size_t* compressed_length);
   112  
   113    // Given data in "compressed[0..compressed_length-1]" generated by
   114    // calling the Snappy::Compress routine, this routine
   115    // stores the uncompressed data to
   116    //    uncompressed[0..GetUncompressedLength(compressed)-1]
   117    // returns false if the message is corrupted and could not be decrypted
   118    bool RawUncompress(const char* compressed, size_t compressed_length,
   119                       char* uncompressed);
   120  
   121    // Given data from the byte source 'compressed' generated by calling
   122    // the Snappy::Compress routine, this routine stores the uncompressed
   123    // data to
   124    //    uncompressed[0..GetUncompressedLength(compressed,compressed_length)-1]
   125    // returns false if the message is corrupted and could not be decrypted
   126    bool RawUncompress(Source* compressed, char* uncompressed);
   127  
   128    // Returns the maximal size of the compressed representation of
   129    // input data that is "source_bytes" bytes in length;
   130    size_t MaxCompressedLength(size_t source_bytes);
   131  
   132    // REQUIRES: "compressed[]" was produced by RawCompress() or Compress()
   133    // Returns true and stores the length of the uncompressed data in
   134    // *result normally.  Returns false on parsing error.
   135    // This operation takes O(1) time.
   136    bool GetUncompressedLength(const char* compressed, size_t compressed_length,
   137                               size_t* result);
   138  
   139    // Returns true iff the contents of "compressed[]" can be uncompressed
   140    // successfully.  Does not return the uncompressed data.  Takes
   141    // time proportional to compressed_length, but is usually at least
   142    // a factor of four faster than actual decompression.
   143    bool IsValidCompressedBuffer(const char* compressed,
   144                                 size_t compressed_length);
   145  
   146    // The size of a compression block. Note that many parts of the compression
   147    // code assumes that kBlockSize <= 65536; in particular, the hash table
   148    // can only store 16-bit offsets, and EmitCopy() also assumes the offset
   149    // is 65535 bytes or less. Note also that if you change this, it will
   150    // affect the framing format (see framing_format.txt).
   151    //
   152    // Note that there might be older data around that is compressed with larger
   153    // block sizes, so the decompression code should not rely on the
   154    // non-existence of long backreferences.
   155    static const int kBlockLog = 16;
   156    static const size_t kBlockSize = 1 << kBlockLog;
   157  
   158    static const int kMaxHashTableBits = 14;
   159    static const size_t kMaxHashTableSize = 1 << kMaxHashTableBits;
   160  
   161  }  // end namespace snappy
   162  }  // end namespace rawp
   163  
   164  
   165  #endif  // RAWP_SNAPPY_H__