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