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