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