Index: sdch/open_vcdiff/depot/opensource/open-vcdiff/src/addrcache.h |
=================================================================== |
--- sdch/open_vcdiff/depot/opensource/open-vcdiff/src/addrcache.h (revision 2678) |
+++ sdch/open_vcdiff/depot/opensource/open-vcdiff/src/addrcache.h (working copy) |
@@ -1,218 +0,0 @@ |
-// Copyright 2007 Google Inc. |
-// Author: Lincoln Smith |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// |
-// Classes to implement the Address Cache and Address Encoding |
-// algorithms described in sections 5.1 - 5.4 of RFC 3284 - |
-// The VCDIFF Generic Differencing and Compression Data Format. |
-// The RFC text can be found at http://www.faqs.org/rfcs/rfc3284.html |
- |
-#ifndef OPEN_VCDIFF_ADDRCACHE_H_ |
-#define OPEN_VCDIFF_ADDRCACHE_H_ |
- |
-#include <config.h> |
-#include <cstring> // memset |
-#include <vector> |
-#include "vcdiff_defs.h" // VCDAddress |
- |
-namespace open_vcdiff { |
- |
-// Implements the "same" and "near" caches |
-// as described in RFC 3284, section 5. The "near" cache allows |
-// efficient reuse of one of the last four referenced addresses |
-// plus a small offset, and the "same" cache allows efficient reuse |
-// of an exact recent address distinguished by its lowest-order bits. |
-// |
-// NOT threadsafe. |
-// |
-class VCDiffAddressCache { |
- public: |
- // The default cache sizes specified in the RFC |
- static const int kDefaultNearCacheSize = 4; |
- static const int kDefaultSameCacheSize = 3; |
- |
- VCDiffAddressCache(int near_cache_size, int same_cache_size); |
- |
- // This version of the constructor uses the default values |
- // kDefaultNearCacheSize and kDefaultSameCacheSize. |
- VCDiffAddressCache(); |
- |
- // Initializes the object before use. This method must be called after |
- // constructing a VCDiffAddressCache/ object, before any other method may be |
- // called. This is because Init() validates near_cache_size_ and |
- // same_cache_size_ before initializing the same and near caches. After the |
- // object has been initialized and used, Init() can be called again to reset |
- // it to its initial state. |
- // |
- bool Init(); |
- |
- int near_cache_size() const { return near_cache_size_; } |
- |
- int same_cache_size() const { return same_cache_size_; } |
- |
- // Returns the first mode number that represents one of the NEAR modes. |
- // The number of NEAR modes is near_cache_size. Each NEAR mode refers to |
- // an element of the near_addresses_ array, where a recently-referenced |
- // address is stored. |
- // |
- static const unsigned char FirstNearMode() { |
- return VCD_FIRST_NEAR_MODE; |
- } |
- |
- // Returns the first mode number that represents one of the SAME modes. |
- // The number of SAME modes is same_cache_size. Each SAME mode refers to |
- // a block of 256 elements of the same_addresses_ array; the lowest-order |
- // 8 bits of the address are used to find the element of this block that |
- // may match the desired address value. |
- // |
- const unsigned char FirstSameMode() const { |
- return VCD_FIRST_NEAR_MODE + near_cache_size(); |
- } |
- |
- // Returns the maximum valid mode number, which happens to be |
- // the last SAME mode. |
- // |
- const unsigned char LastMode() const { |
- return FirstSameMode() + same_cache_size() - 1; |
- } |
- |
- static const unsigned char DefaultLastMode() { |
- return VCD_FIRST_NEAR_MODE |
- + kDefaultNearCacheSize + kDefaultSameCacheSize - 1; |
- } |
- |
- // See the definition of enum VCDiffModes in vcdiff_defs.h, |
- // as well as section 5.3 of the RFC, for a description of |
- // each address mode type (SELF, HERE, NEAR, and SAME). |
- static bool IsSelfMode(unsigned char mode) { |
- return mode == VCD_SELF_MODE; |
- } |
- |
- static bool IsHereMode(unsigned char mode) { |
- return mode == VCD_HERE_MODE; |
- } |
- |
- bool IsNearMode(unsigned char mode) const { |
- return (mode >= FirstNearMode()) && (mode < FirstSameMode()); |
- } |
- |
- bool IsSameMode(unsigned char mode) const { |
- return (mode >= FirstSameMode()) && (mode <= LastMode()); |
- } |
- |
- static VCDAddress DecodeSelfAddress(int32_t encoded_address) { |
- return encoded_address; |
- } |
- |
- static VCDAddress DecodeHereAddress(int32_t encoded_address, |
- VCDAddress here_address) { |
- return here_address - encoded_address; |
- } |
- |
- VCDAddress DecodeNearAddress(unsigned char mode, |
- int32_t encoded_address) const { |
- return NearAddress(mode - FirstNearMode()) + encoded_address; |
- } |
- |
- VCDAddress DecodeSameAddress(unsigned char mode, |
- unsigned char encoded_address) const { |
- return SameAddress(((mode - FirstSameMode()) * 256) + encoded_address); |
- } |
- |
- // Returns true if, when using the given mode, an encoded address |
- // should be written to the delta file as a variable-length integer; |
- // returns false if the encoded address should be written |
- // as a byte value (unsigned char). |
- bool WriteAddressAsVarintForMode(unsigned char mode) const { |
- return !IsSameMode(mode); |
- } |
- |
- // An accessor for an element of the near_addresses_ array. |
- // No bounds checking is performed; the caller must ensure that |
- // Init() has already been called, and that |
- // 0 <= pos < near_cache_size_ |
- // |
- VCDAddress NearAddress(int pos) const { |
- return near_addresses_[pos]; |
- } |
- |
- // An accessor for an element of the same_addresses_ array. |
- // No bounds checking is performed; the caller must ensure that |
- // Init() has already been called, and that |
- // 0 <= pos < (same_cache_size_ * 256) |
- // |
- VCDAddress SameAddress(int pos) const { |
- return same_addresses_[pos]; |
- } |
- |
- // This method will be called whenever an address is calculated for an |
- // encoded or decoded COPY instruction, and will update the contents |
- // of the SAME and NEAR caches. |
- // |
- void UpdateCache(VCDAddress address); |
- |
- // Determines the address mode that yields the most compact encoding |
- // of the given address value. The most compact encoding |
- // is found by looking for the numerically lowest encoded address. |
- // Sets *encoded_addr to the encoded representation of the address |
- // and returns the mode used. |
- // |
- // The caller should pass the return value to the method |
- // WriteAddressAsVarintForMode() to determine whether encoded_addr |
- // should be written to the delta file as a variable-length integer |
- // or as a byte (unsigned char). |
- // |
- unsigned char EncodeAddress(VCDAddress address, |
- VCDAddress here_address, |
- VCDAddress* encoded_addr); |
- |
- // Interprets the next value in the address_stream using the provided mode, |
- // which may need to access the SAME or NEAR address cache. Returns the |
- // decoded address, or one of the following values: |
- // RESULT_ERROR: An invalid address value was found in address_stream. |
- // RESULT_END_OF_DATA: The limit address_stream_end was reached before |
- // the address could be decoded. If more streamed data is expected, |
- // this means that the consumer should block and wait for more data |
- // before continuing to decode. If no more data is expected, this |
- // return value signals an error condition. |
- // |
- // If successful, *address_stream will be incremented past the decoded address |
- // position. If RESULT_ERROR or RESULT_END_OF_DATA is returned, |
- // then the value of *address_stream will not have changed. |
- // |
- VCDAddress DecodeAddress(VCDAddress here_address, |
- unsigned char mode, |
- const char** address_stream, |
- const char* address_stream_end); |
- |
- private: |
- // The number of addresses to be kept in the NEAR cache. |
- const int near_cache_size_; |
- // The number of 256-byte blocks to store in the SAME cache. |
- const int same_cache_size_; |
- // The next position in the NEAR cache to which an address will be written. |
- int next_slot_; |
- // NEAR cache contents |
- std::vector<VCDAddress> near_addresses_; |
- // SAME cache contents |
- std::vector<VCDAddress> same_addresses_; |
- |
- // Making these private avoids implicit copy constructor & assignment operator |
- VCDiffAddressCache(const VCDiffAddressCache&); // NOLINT |
- void operator=(const VCDiffAddressCache&); |
-}; |
- |
-} // namespace open_vcdiff |
- |
-#endif // OPEN_VCDIFF_ADDRCACHE_H_ |