28 dataSize (sourceDataSize)
35 : data (sourceData.getData()),
36 dataSize (sourceData.getSize())
42 void MemoryInputStream::createInternalCopy()
44 internalCopy.
malloc (dataSize);
45 memcpy (internalCopy, data, dataSize);
55 return (int64) dataSize;
60 jassert (buffer !=
nullptr && howMany >= 0);
62 if (howMany <= 0 || position >= dataSize)
65 auto num = jmin ((
size_t) howMany, dataSize - position);
69 memcpy (buffer, addBytesToPointer (data, position), num);
78 return position >= dataSize;
83 position = (size_t) jlimit ((int64) 0, (int64) dataSize, pos);
89 return (int64) position;
94 if (numBytesToSkip > 0)
101 class MemoryStreamTests :
public UnitTest
105 :
UnitTest (
"MemoryInputStream & MemoryOutputStream",
"Streams")
108 void runTest()
override
110 beginTest (
"Basics");
111 Random r = getRandom();
113 int randomInt = r.nextInt();
114 int64 randomInt64 = r.nextInt64();
115 double randomDouble = r.nextDouble();
116 String randomString (createRandomWideCharString (r));
118 MemoryOutputStream mo;
119 mo.writeInt (randomInt);
120 mo.writeIntBigEndian (randomInt);
121 mo.writeCompressedInt (randomInt);
122 mo.writeString (randomString);
123 mo.writeInt64 (randomInt64);
124 mo.writeInt64BigEndian (randomInt64);
125 mo.writeDouble (randomDouble);
126 mo.writeDoubleBigEndian (randomDouble);
128 MemoryInputStream mi (mo.getData(), mo.getDataSize(),
false);
129 expect (mi.readInt() == randomInt);
130 expect (mi.readIntBigEndian() == randomInt);
131 expect (mi.readCompressedInt() == randomInt);
132 expectEquals (mi.readString(), randomString);
133 expect (mi.readInt64() == randomInt64);
134 expect (mi.readInt64BigEndian() == randomInt64);
135 expect (mi.readDouble() == randomDouble);
136 expect (mi.readDoubleBigEndian() == randomDouble);
138 const MemoryBlock data (
"abcdefghijklmnopqrstuvwxyz", 26);
139 MemoryInputStream stream (data,
true);
143 expectEquals (stream.getPosition(), (int64) 0);
144 expectEquals (stream.getTotalLength(), (int64) data.getSize());
145 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
146 expect (! stream.isExhausted());
148 size_t numBytesRead = 0;
149 MemoryBlock readBuffer (data.getSize());
151 while (numBytesRead < data.getSize())
153 numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);
155 expectEquals (stream.getPosition(), (int64) numBytesRead);
156 expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));
157 expect (stream.isExhausted() == (numBytesRead == data.getSize()));
160 expectEquals (stream.getPosition(), (int64) data.getSize());
161 expectEquals (stream.getNumBytesRemaining(), (int64) 0);
162 expect (stream.isExhausted());
164 expect (readBuffer == data);
168 stream.setPosition (0);
169 expectEquals (stream.getPosition(), (int64) 0);
170 expectEquals (stream.getTotalLength(), (int64) data.getSize());
171 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
172 expect (! stream.isExhausted());
175 const int numBytesToSkip = 5;
177 while (numBytesRead < data.getSize())
179 stream.skipNextBytes (numBytesToSkip);
180 numBytesRead += numBytesToSkip;
181 numBytesRead = std::min (numBytesRead, data.getSize());
183 expectEquals (stream.getPosition(), (int64) numBytesRead);
184 expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));
185 expect (stream.isExhausted() == (numBytesRead == data.getSize()));
188 expectEquals (stream.getPosition(), (int64) data.getSize());
189 expectEquals (stream.getNumBytesRemaining(), (int64) 0);
190 expect (stream.isExhausted());
193 static String createRandomWideCharString (Random& r)
195 juce_wchar buffer [50] = { 0 };
197 for (
int i = 0; i < numElementsInArray (buffer) - 1; ++i)
203 buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1));
208 buffer[i] = (juce_wchar) (1 + r.nextInt (0xff));
211 return CharPointer_UTF32 (buffer);
215 static MemoryStreamTests memoryInputStreamUnitTests;