1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2008 Google Inc. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: Lincoln Smith 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Licensed under the Apache License, Version 2.0 (the "License"); 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// you may not use this file except in compliance with the License. 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// You may obtain a copy of the License at 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// http://www.apache.org/licenses/LICENSE-2.0 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unless required by applicable law or agreed to in writing, software 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distributed under the License is distributed on an "AS IS" BASIS, 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See the License for the specific language governing permissions and 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// limitations under the License. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef OPEN_VCDIFF_OUTPUT_STRING_H_ 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define OPEN_VCDIFF_OUTPUT_STRING_H_ 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stddef.h> // size_t 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace open_vcdiff { 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This interface allows clients of VCDiff[Streaming]Encoder and 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// VCDiff[Streaming]Decoder to use different string types to receive the output 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of those interfaces. 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Only the following operations can be performed on an output string, and their 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// semantics must be identical to the std::string methods of the same names: 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// append() 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// clear() 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// push_back() 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// size() 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The versions of these methods that take a std::string argument are not 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// supported by OutputStringInterface. 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// There is one additional operation that can be performed on an output string: 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ReserveAdditionalBytes(). This asks the underlying output type to reserve 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enough capacity for the number of additional bytes requested in addition to 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// existing content. The decoder knows the total expected output size in 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// advance, so one large ReserveAdditionalBytes() operation precedes many small 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// append() operations. For output types that gain no advantage from knowing in 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// advance how many bytes will be appended, ReserveAdditionalBytes() can be 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// defined to do nothing. 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass OutputStringInterface { 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~OutputStringInterface() { } 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual OutputStringInterface& append(const char* s, size_t n) = 0; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void clear() = 0; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void push_back(char c) = 0; 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void ReserveAdditionalBytes(size_t res_arg) = 0; 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual size_t size() const = 0; 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This template can be used to wrap any class that supports the operations 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// needed by OutputStringInterface, including std::string. A class that has 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// different names or syntax for these operations will need specialized 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// definitions of OutputString methods -- see output_string_types.h for some 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// examples of how to do this. 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate<class StringClass> 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass OutputString : public OutputStringInterface { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit OutputString(StringClass* impl) : impl_(impl) { } 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~OutputString() { } 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual OutputString& append(const char* s, size_t n) { 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->append(s, n); 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *this; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void clear() { 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->clear(); 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void push_back(char c) { 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->push_back(c); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void ReserveAdditionalBytes(size_t res_arg) { 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->reserve(impl_->size() + res_arg); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual size_t size() const { 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->size(); 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StringClass* impl_; 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Making these private avoids implicit copy constructor & assignment operator 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott OutputString(const OutputString&); 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void operator=(const OutputString&); 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Don't allow the OutputString template to be based upon a pointer to 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OutputStringInterface. Enforce this restriction by defining this class to 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// lack any functions expected of an OutputString. 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate<> class OutputString<OutputStringInterface> { }; 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace open_vcdiff 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // OPEN_VCDIFF_OUTPUT_STRING_H_ 110