mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
152 lines
4.6 KiB
C++
152 lines
4.6 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
|
|
|
Portions of this file are from JUCE.
|
|
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
Please visit http://www.juce.com
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
MemoryInputStream::MemoryInputStream (const void* const sourceData,
|
|
const size_t sourceDataSize,
|
|
const bool keepInternalCopy)
|
|
: data (sourceData),
|
|
dataSize (sourceDataSize),
|
|
position (0)
|
|
{
|
|
if (keepInternalCopy)
|
|
createInternalCopy();
|
|
}
|
|
|
|
MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData,
|
|
const bool keepInternalCopy)
|
|
: data (sourceData.getData()),
|
|
dataSize (sourceData.getSize()),
|
|
position (0)
|
|
{
|
|
if (keepInternalCopy)
|
|
createInternalCopy();
|
|
}
|
|
|
|
void MemoryInputStream::createInternalCopy()
|
|
{
|
|
internalCopy.malloc (dataSize);
|
|
memcpy (internalCopy, data, dataSize);
|
|
data = internalCopy;
|
|
}
|
|
|
|
MemoryInputStream::~MemoryInputStream()
|
|
{
|
|
}
|
|
|
|
int64 MemoryInputStream::getTotalLength()
|
|
{
|
|
return dataSize;
|
|
}
|
|
|
|
int MemoryInputStream::read (void* const buffer, const int howMany)
|
|
{
|
|
bassert (buffer != nullptr && howMany >= 0);
|
|
|
|
const int num = bmin (howMany, (int) (dataSize - position));
|
|
if (num <= 0)
|
|
return 0;
|
|
|
|
memcpy (buffer, addBytesToPointer (data, position), (size_t) num);
|
|
position += (unsigned int) num;
|
|
return num;
|
|
}
|
|
|
|
bool MemoryInputStream::isExhausted()
|
|
{
|
|
return position >= dataSize;
|
|
}
|
|
|
|
bool MemoryInputStream::setPosition (const int64 pos)
|
|
{
|
|
position = (size_t) blimit ((int64) 0, (int64) dataSize, pos);
|
|
return true;
|
|
}
|
|
|
|
int64 MemoryInputStream::getPosition()
|
|
{
|
|
return position;
|
|
}
|
|
|
|
//==============================================================================
|
|
|
|
class MemoryStreamTests : public UnitTest
|
|
{
|
|
public:
|
|
MemoryStreamTests() : UnitTest ("MemoryStream", "beast") { }
|
|
|
|
void runTest()
|
|
{
|
|
beginTestCase ("Basics");
|
|
Random r;
|
|
|
|
int randomInt = r.nextInt();
|
|
int64 randomInt64 = r.nextInt64();
|
|
double randomDouble = r.nextDouble();
|
|
String randomString (createRandomWideCharString());
|
|
|
|
MemoryOutputStream mo;
|
|
mo.writeInt (randomInt);
|
|
mo.writeIntBigEndian (randomInt);
|
|
mo.writeCompressedInt (randomInt);
|
|
mo.writeString (randomString);
|
|
mo.writeInt64 (randomInt64);
|
|
mo.writeInt64BigEndian (randomInt64);
|
|
mo.writeDouble (randomDouble);
|
|
mo.writeDoubleBigEndian (randomDouble);
|
|
|
|
MemoryInputStream mi (mo.getData(), mo.getDataSize(), false);
|
|
expect (mi.readInt() == randomInt);
|
|
expect (mi.readIntBigEndian() == randomInt);
|
|
expect (mi.readCompressedInt() == randomInt);
|
|
expectEquals (mi.readString(), randomString);
|
|
expect (mi.readInt64() == randomInt64);
|
|
expect (mi.readInt64BigEndian() == randomInt64);
|
|
expect (mi.readDouble() == randomDouble);
|
|
expect (mi.readDoubleBigEndian() == randomDouble);
|
|
}
|
|
|
|
static String createRandomWideCharString()
|
|
{
|
|
beast_wchar buffer [50] = { 0 };
|
|
Random r;
|
|
|
|
for (int i = 0; i < numElementsInArray (buffer) - 1; ++i)
|
|
{
|
|
if (r.nextBool())
|
|
{
|
|
do
|
|
{
|
|
buffer[i] = (beast_wchar) (1 + r.nextInt (0x10ffff - 1));
|
|
}
|
|
while (! CharPointer_UTF16::canRepresent (buffer[i]));
|
|
}
|
|
else
|
|
buffer[i] = (beast_wchar) (1 + r.nextInt (0xff));
|
|
}
|
|
|
|
return CharPointer_UTF32 (buffer);
|
|
}
|
|
};
|
|
|
|
static MemoryStreamTests memoryStreamTests;
|