snappy-sinksource.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. #ifndef UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_
  29. #define UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_
  30. #include <stddef.h>
  31. namespace snappy {
  32. // A Sink is an interface that consumes a sequence of bytes.
  33. class Sink {
  34. public:
  35. Sink() { }
  36. virtual ~Sink();
  37. // Append "bytes[0,n-1]" to this.
  38. virtual void Append(const char* bytes, size_t n) = 0;
  39. // Returns a writable buffer of the specified length for appending.
  40. // May return a pointer to the caller-owned scratch buffer which
  41. // must have at least the indicated length. The returned buffer is
  42. // only valid until the next operation on this Sink.
  43. //
  44. // After writing at most "length" bytes, call Append() with the
  45. // pointer returned from this function and the number of bytes
  46. // written. Many Append() implementations will avoid copying
  47. // bytes if this function returned an internal buffer.
  48. //
  49. // If a non-scratch buffer is returned, the caller may only pass a
  50. // prefix of it to Append(). That is, it is not correct to pass an
  51. // interior pointer of the returned array to Append().
  52. //
  53. // The default implementation always returns the scratch buffer.
  54. virtual char* GetAppendBuffer(size_t length, char* scratch);
  55. private:
  56. // No copying
  57. Sink(const Sink&);
  58. void operator=(const Sink&);
  59. };
  60. // A Source is an interface that yields a sequence of bytes
  61. class Source {
  62. public:
  63. Source() { }
  64. virtual ~Source();
  65. // Return the number of bytes left to read from the source
  66. virtual size_t Available() const = 0;
  67. // Peek at the next flat region of the source. Does not reposition
  68. // the source. The returned region is empty iff Available()==0.
  69. //
  70. // Returns a pointer to the beginning of the region and store its
  71. // length in *len.
  72. //
  73. // The returned region is valid until the next call to Skip() or
  74. // until this object is destroyed, whichever occurs first.
  75. //
  76. // The returned region may be larger than Available() (for example
  77. // if this ByteSource is a view on a substring of a larger source).
  78. // The caller is responsible for ensuring that it only reads the
  79. // Available() bytes.
  80. virtual const char* Peek(size_t* len) = 0;
  81. // Skip the next n bytes. Invalidates any buffer returned by
  82. // a previous call to Peek().
  83. // REQUIRES: Available() >= n
  84. virtual void Skip(size_t n) = 0;
  85. private:
  86. // No copying
  87. Source(const Source&);
  88. void operator=(const Source&);
  89. };
  90. // A Source implementation that yields the contents of a flat array
  91. class ByteArraySource : public Source {
  92. public:
  93. ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { }
  94. virtual ~ByteArraySource();
  95. virtual size_t Available() const;
  96. virtual const char* Peek(size_t* len);
  97. virtual void Skip(size_t n);
  98. private:
  99. const char* ptr_;
  100. size_t left_;
  101. };
  102. // A Sink implementation that writes to a flat array without any bound checks.
  103. class UncheckedByteArraySink : public Sink {
  104. public:
  105. explicit UncheckedByteArraySink(char* dest) : dest_(dest) { }
  106. virtual ~UncheckedByteArraySink();
  107. virtual void Append(const char* data, size_t n);
  108. virtual char* GetAppendBuffer(size_t len, char* scratch);
  109. // Return the current output pointer so that a caller can see how
  110. // many bytes were produced.
  111. // Note: this is not a Sink method.
  112. char* CurrentDestination() const { return dest_; }
  113. private:
  114. char* dest_;
  115. };
  116. }
  117. #endif // UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_