1311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Copyright 2008 Google Inc. 2311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Author: Lincoln Smith 3311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 4311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Licensed under the Apache License, Version 2.0 (the "License"); 5311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// you may not use this file except in compliance with the License. 6311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// You may obtain a copy of the License at 7311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 8311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// http://www.apache.org/licenses/LICENSE-2.0 9311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 10311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Unless required by applicable law or agreed to in writing, software 11311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// distributed under the License is distributed on an "AS IS" BASIS, 12311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// See the License for the specific language governing permissions and 14311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// limitations under the License. 15311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 16311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifndef OPEN_VCDIFF_OUTPUT_STRING_H_ 17311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#define OPEN_VCDIFF_OUTPUT_STRING_H_ 18311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff#include <stddef.h> // size_t 20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff { 22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This interface allows clients of VCDiff[Streaming]Encoder and 24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// VCDiff[Streaming]Decoder to use different string types to receive the output 25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// of those interfaces. 26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Only the following operations can be performed on an output string, and their 28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// semantics must be identical to the std::string methods of the same names: 29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// append() 30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// clear() 31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// push_back() 32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// size() 33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// The versions of these methods that take a std::string argument are not 35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// supported by OutputStringInterface. 36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// There is one additional operation that can be performed on an output string: 38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// ReserveAdditionalBytes(). This asks the underlying output type to reserve 39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// enough capacity for the number of additional bytes requested in addition to 40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// existing content. The decoder knows the total expected output size in 41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// advance, so one large ReserveAdditionalBytes() operation precedes many small 42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// append() operations. For output types that gain no advantage from knowing in 43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// advance how many bytes will be appended, ReserveAdditionalBytes() can be 44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// defined to do nothing. 45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass OutputStringInterface { 46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public: 47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~OutputStringInterface() { } 48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual OutputStringInterface& append(const char* s, size_t n) = 0; 50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void clear() = 0; 52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void push_back(char c) = 0; 54311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void ReserveAdditionalBytes(size_t res_arg) = 0; 56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual size_t size() const = 0; 58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This template can be used to wrap any class that supports the operations 61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// needed by OutputStringInterface, including std::string. A class that has 62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// different names or syntax for these operations will need specialized 63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// definitions of OutputString methods -- see output_string_types.h for some 64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// examples of how to do this. 65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftemplate<class StringClass> 66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass OutputString : public OutputStringInterface { 67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public: 68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff explicit OutputString(StringClass* impl) : impl_(impl) { } 69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~OutputString() { } 71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual OutputString& append(const char* s, size_t n) { 73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff impl_->append(s, n); 74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff return *this; 75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void clear() { 78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff impl_->clear(); 79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void push_back(char c) { 82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff impl_->push_back(c); 83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual void ReserveAdditionalBytes(size_t res_arg) { 86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff impl_->reserve(impl_->size() + res_arg); 87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual size_t size() const { 90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff return impl_->size(); 91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff StringClass* impl_; 95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private: 97311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Making these private avoids implicit copy constructor & assignment operator 98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff OutputString(const OutputString&); 99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff void operator=(const OutputString&); 100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Don't allow the OutputString template to be based upon a pointer to 103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// OutputStringInterface. Enforce this restriction by defining this class to 104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// lack any functions expected of an OutputString. 105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftemplate<> class OutputString<OutputStringInterface> { }; 106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} // namespace open_vcdiff 108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif // OPEN_VCDIFF_OUTPUT_STRING_H_ 110