164fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// Copyright 2008 Google Inc. 264fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// Author: Lincoln Smith 364fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// 464fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// Licensed under the Apache License, Version 2.0 (the "License"); 564fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// you may not use this file except in compliance with the License. 664fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// You may obtain a copy of the License at 764fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// 864fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// http://www.apache.org/licenses/LICENSE-2.0 964fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// 1064fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// Unless required by applicable law or agreed to in writing, software 1164fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// distributed under the License is distributed on an "AS IS" BASIS, 1264fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1364fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// See the License for the specific language governing permissions and 1464fe2324403ea78dbd781073f4e5b34768676e2copenvcdiff@gmail.com// limitations under the License. 15d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// 16d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// Definition of an abstract class that describes the interface between the 17d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// encoding engine (which finds the best string matches between the source and 18d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// target data) and the code table writer. The code table writer is passed a 19d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// series of Add, Copy, and Run instructions and produces an output file in the 20d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// desired format. 21d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 22f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com#ifndef OPEN_VCDIFF_CODETABLEWRITER_INTERFACE_H_ 23f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com#define OPEN_VCDIFF_CODETABLEWRITER_INTERFACE_H_ 24d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 25d18457863096b3685e56f5a8919959f6afbdb121openvcdiff#include <stddef.h> // size_t 26732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com#include "checksum.h" // VCDChecksum 27732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com#include "google/format_extension_flags.h" // VCDiffFormatExtensionFlags 28d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 29d18457863096b3685e56f5a8919959f6afbdb121openvcdiffnamespace open_vcdiff { 30d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 31d18457863096b3685e56f5a8919959f6afbdb121openvcdiffclass OutputStringInterface; 32d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 33d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// The method calls after construction should follow this pattern: 34d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// {{Add|Copy|Run}* Output}* 35d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// 36d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// Output() will produce an encoding using the given series of Add, Copy, 37d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// and/or Run instructions. One implementation of the interface 38d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// (VCDiffCodeTableWriter) produces a VCDIFF delta window, but other 39d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// implementations may be used to produce other output formats, or as test 40d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// mocks, or to gather encoding statistics. 41d18457863096b3685e56f5a8919959f6afbdb121openvcdiff// 42d18457863096b3685e56f5a8919959f6afbdb121openvcdiffclass CodeTableWriterInterface { 43d18457863096b3685e56f5a8919959f6afbdb121openvcdiff public: 44d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual ~CodeTableWriterInterface() { } 45d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 46732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Initializes the constructed object for use. It will return 47732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // false if there was an error initializing the object, or true if it 48732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // was successful. After the object has been initialized and used, 49732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Init() can be called again to restore the initial state of the object. 50732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com virtual bool Init(size_t dictionary_size) = 0; 51732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com 52732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Writes the header to the output string. 53732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com virtual void WriteHeader(OutputStringInterface* out, 54732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com VCDiffFormatExtensionFlags format_extensions) = 0; 55732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com 56d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // Encode an ADD opcode with the "size" bytes starting at data 57d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual void Add(const char* data, size_t size) = 0; 58d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 59d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // Encode a COPY opcode with args "offset" (into dictionary) and "size" bytes. 60d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual void Copy(int32_t offset, size_t size) = 0; 61d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 62d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // Encode a RUN opcode for "size" copies of the value "byte". 63d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual void Run(size_t size, unsigned char byte) = 0; 64d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 65732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Adds a checksum to the output. 66732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com virtual void AddChecksum(VCDChecksum checksum) = 0; 67732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com 68732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Appends the encoded delta window to the output 69d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // string. The output string is not null-terminated and may contain embedded 70d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // '\0' characters. 71d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual void Output(OutputStringInterface* out) = 0; 72d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 73732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com // Finishes encoding. 74732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com virtual void FinishEncoding(OutputStringInterface* out) = 0; 75732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com 76d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // Returns the number of target bytes processed, which is the sum of all the 77d18457863096b3685e56f5a8919959f6afbdb121openvcdiff // size arguments passed to Add(), Copy(), and Run(). 78d18457863096b3685e56f5a8919959f6afbdb121openvcdiff virtual size_t target_length() const = 0; 79d18457863096b3685e56f5a8919959f6afbdb121openvcdiff}; 80d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 81d18457863096b3685e56f5a8919959f6afbdb121openvcdiff} // namespace open_vcdiff 82d18457863096b3685e56f5a8919959f6afbdb121openvcdiff 83f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com#endif // OPEN_VCDIFF_CODETABLEWRITER_INTERFACE_H_ 84