LMMS
Loading...
Searching...
No Matches
MemoryOutputStream.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2016 ROLI Ltd.
6 Copyright (C) 2017 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the ISC license
9 http://www.isc.org/downloads/software-support-policy/isc-license/
10
11 Permission to use, copy, modify, and/or distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
16 TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
18 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 OF THIS SOFTWARE.
22
23 ==============================================================================
24*/
25
26#include "MemoryOutputStream.h"
27#include "InputStream.h"
28
29namespace water {
30
33 position (0), size (0),
35{
36 internalBlock.setSize (initialSize, false);
37}
38
40 const bool appendToExistingBlockContent)
41 : internalBlock(), blockToUse (memoryBlockToWriteTo),
42 position (0), size (0),
44{
45 if (appendToExistingBlockContent)
46 position = size = memoryBlockToWriteTo.getSize();
47}
48
53
58
64
65void MemoryOutputStream::preallocate (const size_t bytesToPreallocate)
66{
67 blockToUse.ensureSize (bytesToPreallocate + 1);
68}
69
71{
72 position = 0;
73 size = 0;
74}
75
77{
78 CARLA_SAFE_ASSERT_RETURN ((ssize_t) numBytes >= 0, nullptr);
79
80 const size_t storageNeeded = position + numBytes;
81
82 if (storageNeeded >= blockToUse.getSize())
83 blockToUse.ensureSize ((storageNeeded + jmin (storageNeeded / 2, (size_t) (1024 * 1024)) + 32) & ~31u);
84
85 char* const data = static_cast<char*> (blockToUse.getData());
86 char* const writePointer = data + position;
87 position += numBytes;
89 return writePointer;
90}
91
92bool MemoryOutputStream::write (const void* const buffer, size_t howMany)
93{
94 CARLA_SAFE_ASSERT_RETURN (buffer != nullptr, false);
95
96 if (howMany == 0)
97 return true;
98
99 if (char* const dest = prepareToWrite (howMany))
100 {
101 std::memcpy (dest, buffer, howMany);
102 return true;
103 }
104
105 return false;
106}
107
109{
110 if (howMany == 0)
111 return true;
112
113 if (char* dest = prepareToWrite (howMany))
114 {
115 memset (dest, byte, howMany);
116 return true;
117 }
118
119 return false;
120}
121
123{
125 {
126 CharPointer_UTF8 (dest).write (c);
127 return true;
128 }
129
130 return false;
131}
132
137
139{
140 if (blockToUse.getSize() > size)
141 static_cast<char*> (blockToUse.getData()) [size] = 0;
142
143 return blockToUse.getData();
144}
145
147{
148 if (blockToUse.getSize() > size)
149 static_cast<char*> (blockToUse.getData()) [size] = 0;
150
151 return blockToUse.release();
152}
153
155{
156 if (newPosition <= (int64) size)
157 {
158 // ok to seek backwards
159 position = jlimit ((size_t) 0, size, (size_t) newPosition);
160 return true;
161 }
162
163 // can't move beyond the end of the stream..
164 return false;
165}
166
168{
169 // before writing from an input, see if we can preallocate to make it more efficient..
170 int64 availableData = source.getTotalLength() - source.getPosition();
171
172 if (availableData > 0)
173 {
174 if (maxNumBytesToWrite > availableData || maxNumBytesToWrite < 0)
175 maxNumBytesToWrite = availableData;
176
177 preallocate (blockToUse.getSize() + (size_t) maxNumBytesToWrite);
178 }
179
180 return OutputStream::writeFromInputStream (source, maxNumBytesToWrite);
181}
182
184{
185 const char* const d = static_cast<const char*> (getData());
187}
188
193
195{
196 const size_t dataSize = streamToRead.getDataSize();
197
198 if (dataSize > 0)
199 stream.write (streamToRead.getData(), dataSize);
200
201 return stream;
202}
203
204}
#define CARLA_SAFE_ASSERT_RETURN(cond, ret)
Definition CarlaDefines.h:190
#define noexcept
Definition DistrhoDefines.h:72
Definition CharPointer_UTF8.h:45
static size_t getBytesRequiredFor(const water_uchar charToWrite) noexcept
Definition CharPointer_UTF8.h:294
void write(const water_uchar charToWrite) noexcept
Definition CharPointer_UTF8.h:335
Definition InputStream.h:42
virtual int64 getTotalLength()=0
virtual int64 getPosition()=0
Definition MemoryBlock.h:39
size_t getSize() const noexcept
Definition MemoryBlock.h:102
Definition MemoryOutputStream.h:42
void * getDataAndRelease() noexcept
Definition MemoryOutputStream.cpp:146
void preallocate(size_t bytesToPreallocate)
Definition MemoryOutputStream.cpp:65
size_t size
Definition MemoryOutputStream.h:125
void trimExternalBlockSize()
Definition MemoryOutputStream.cpp:59
bool writeRepeatedByte(uint8 byte, size_t numTimesToRepeat) override
Definition MemoryOutputStream.cpp:108
MemoryBlock & blockToUse
Definition MemoryOutputStream.h:124
bool usingInternalBlock
Definition MemoryOutputStream.h:126
char * prepareToWrite(size_t)
Definition MemoryOutputStream.cpp:76
size_t getDataSize() const noexcept
Definition MemoryOutputStream.h:84
void flush() override
Definition MemoryOutputStream.cpp:54
int64 writeFromInputStream(InputStream &, int64 maxNumBytesToWrite) override
Definition MemoryOutputStream.cpp:167
bool write(const void *, size_t) override
Definition MemoryOutputStream.cpp:92
String toString() const
Definition MemoryOutputStream.cpp:189
bool setPosition(int64) override
Definition MemoryOutputStream.cpp:154
String toUTF8() const
Definition MemoryOutputStream.cpp:183
bool appendUTF8Char(water_uchar character)
Definition MemoryOutputStream.cpp:122
MemoryOutputStream(size_t initialSize=256)
Definition MemoryOutputStream.cpp:31
const void * getData() const noexcept
Definition MemoryOutputStream.cpp:138
MemoryBlock getMemoryBlock() const
Definition MemoryOutputStream.cpp:133
~MemoryOutputStream()
Definition MemoryOutputStream.cpp:49
MemoryBlock internalBlock
Definition MemoryOutputStream.h:123
void reset() noexcept
Definition MemoryOutputStream.cpp:70
size_t position
Definition MemoryOutputStream.h:125
Definition OutputStream.h:44
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual int64 writeFromInputStream(InputStream &source, int64 maxNumBytesToWrite)
Definition OutputStream.cpp:222
Definition String.h:48
static String createStringFromData(const void *data, int size)
Definition String.cpp:1721
unsigned d
Definition inflate.c:940
JSAMPIMAGE data
Definition jpeglib.h:945
Definition AudioSampleBuffer.h:33
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
OutputStream & operator<<(OutputStream &stream, const MemoryOutputStream &streamToRead)
Definition MemoryOutputStream.cpp:194
long long int64
Definition water.h:100
unsigned char uint8
Definition water.h:90
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
Type jlimit(const Type lowerLimit, const Type upperLimit, const Type valueToConstrain) noexcept
Definition MathsFunctions.h:169
uint32 water_uchar
Definition CharacterFunctions.h:38
#define true
Definition ordinals.h:82
#define false
Definition ordinals.h:83
return c
Definition crypt.c:175
#define const
Definition zconf.h:137