blob: 9061432018d81934c3cd7a047538457c7be10dad [file] [log] [blame]
Ethan Nicholas0df1b042017-03-31 13:56:23 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_STRINGSTREAM
9#define SKSL_STRINGSTREAM
10
11#include "SkSLOutputStream.h"
12
13#ifdef SKSL_STANDALONE
14
15namespace SkSL {
16
17class StringStream : public OutputStream {
18public:
19 void write8(uint8_t b) override {
20 fBuffer += (char) b;
21 }
22
23 void writeText(const char* s) override {
24 fBuffer += s;
25 }
26
27 void write(const void* s, size_t size) override {
28 fBuffer.append((const char*) s, size);
29 }
30
31 const char* data() const {
32 return fBuffer.c_str();
33 }
34
35 size_t size() const {
36 return fBuffer.size();
37 }
38
39 void reset() {
40 fBuffer = "";
41 }
42
43private:
44 String fBuffer;
45};
46
47#else
48
49#include "SkData.h"
50#include "SkStream.h"
51
52namespace SkSL {
53
54class StringStream : public OutputStream {
55public:
56 void write8(uint8_t b) override {
57 SkASSERT(!fData);
58 fStream.write8(b);
59 }
60
61 void writeText(const char* s) override {
62 SkASSERT(!fData);
63 fStream.writeText(s);
64 }
65
66 void write(const void* s, size_t size) override {
67 SkASSERT(!fData);
68 fStream.write(s, size);
69 }
70
71 const char* data() const {
72 if (!fData) {
73 fData = fStream.detachAsData();
74 }
75 return (const char*) fData->data();
76 }
77
78 size_t size() const {
79 if (!fData) {
80 fData = fStream.detachAsData();
81 }
82 return fData->size();
83 }
84
85 void reset() {
86 fStream.reset();
87 fData = nullptr;
88 }
89
90private:
91 mutable SkDynamicMemoryWStream fStream;
92 mutable sk_sp<SkData> fData;
93};
94
95#endif // SKSL_STANDALONE
96
97} // namespace
98
99#endif