blob: 58d038ab67099365e8541a25871d93b63ebea6db [file] [log] [blame]
Brian Silverman70325d62015-09-20 17:00:43 -04001// Copyright (c) 2007, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30// ---
31// Author: csilvers@google.com (Craig Silverstein)
32//
33// When we expand a template, we expand into an abstract "emitter".
34// This is typically a string, but could be a file-wrapper, or any
35// other data structure that supports this very simple "append" API.
36
37#ifndef TEMPLATE_TEMPLATE_EMITTER_H_
38#define TEMPLATE_TEMPLATE_EMITTER_H_
39
40#include <sys/types.h> // for size_t
41#include <string>
42
43// NOTE: if you are statically linking the template library into your binary
44// (rather than using the template .dll), set '/D CTEMPLATE_DLL_DECL='
45// as a compiler flag in your project file to turn off the dllimports.
46#ifndef CTEMPLATE_DLL_DECL
47# define CTEMPLATE_DLL_DECL __declspec(dllimport)
48#endif
49
50namespace ctemplate {
51
52class CTEMPLATE_DLL_DECL ExpandEmitter {
53 public:
54 ExpandEmitter() {}
55 virtual ~ExpandEmitter() {}
56 virtual void Emit(char c) = 0;
57 virtual void Emit(const std::string& s) = 0;
58 virtual void Emit(const char* s) = 0;
59 virtual void Emit(const char* s, size_t slen) = 0;
60};
61
62
63class CTEMPLATE_DLL_DECL StringEmitter : public ExpandEmitter {
64 std::string* const outbuf_;
65 public:
66 StringEmitter(std::string* outbuf) : outbuf_(outbuf) {}
67 virtual void Emit(char c) { *outbuf_ += c; }
68 virtual void Emit(const std::string& s) { *outbuf_ += s; }
69 virtual void Emit(const char* s) { *outbuf_ += s; }
70 virtual void Emit(const char* s, size_t slen) { outbuf_->append(s, slen); }
71};
72
73}
74
75
76#endif // TEMPLATE_TEMPLATE_EMITTER_H_