git subrepo clone --branch=sono6good https://github.com/essej/JUCE.git deps/juce
subrepo: subdir: "deps/juce" merged: "b13f9084e" upstream: origin: "https://github.com/essej/JUCE.git" branch: "sono6good" commit: "b13f9084e" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
This commit is contained in:
249
deps/juce/modules/juce_osc/osc/juce_OSCBundle.cpp
vendored
Normal file
249
deps/juce/modules/juce_osc/osc/juce_OSCBundle.cpp
vendored
Normal file
@ -0,0 +1,249 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
OSCBundle::OSCBundle()
|
||||
{
|
||||
}
|
||||
|
||||
OSCBundle::OSCBundle (OSCTimeTag t) : timeTag (t)
|
||||
{
|
||||
}
|
||||
|
||||
// Note: The class invariant of OSCBundle::Element is that
|
||||
// at least one of the pointers bundle and message is nullptr
|
||||
// and the other one always points to a valid object.
|
||||
|
||||
OSCBundle::Element::Element (OSCMessage m)
|
||||
: message (new OSCMessage (m)), bundle (nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
OSCBundle::Element::Element (OSCBundle b)
|
||||
: message (nullptr), bundle (new OSCBundle (b))
|
||||
{
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
OSCBundle::Element::Element (const Element& other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
message = nullptr;
|
||||
bundle = nullptr;
|
||||
|
||||
if (other.isMessage())
|
||||
message.reset (new OSCMessage (other.getMessage()));
|
||||
else
|
||||
bundle.reset (new OSCBundle (other.getBundle()));
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
OSCBundle::Element::~Element()
|
||||
{
|
||||
bundle = nullptr;
|
||||
message = nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool OSCBundle::Element::isMessage() const noexcept
|
||||
{
|
||||
return message != nullptr;
|
||||
}
|
||||
|
||||
bool OSCBundle::Element::isBundle() const noexcept
|
||||
{
|
||||
return bundle != nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const OSCMessage& OSCBundle::Element::getMessage() const
|
||||
{
|
||||
if (message == nullptr)
|
||||
{
|
||||
// This element is not a bundle! You must check this first before accessing.
|
||||
jassertfalse;
|
||||
throw OSCInternalError ("Access error in OSC bundle element.");
|
||||
}
|
||||
|
||||
return *message;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const OSCBundle& OSCBundle::Element::getBundle() const
|
||||
{
|
||||
if (bundle == nullptr)
|
||||
{
|
||||
// This element is not a bundle! You must check this first before accessing.
|
||||
jassertfalse;
|
||||
throw OSCInternalError ("Access error in OSC bundle element.");
|
||||
}
|
||||
|
||||
return *bundle;
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
//==============================================================================
|
||||
#if JUCE_UNIT_TESTS
|
||||
|
||||
class OSCBundleTests : public UnitTest
|
||||
{
|
||||
public:
|
||||
OSCBundleTests()
|
||||
: UnitTest ("OSCBundle class", UnitTestCategories::osc)
|
||||
{}
|
||||
|
||||
void runTest()
|
||||
{
|
||||
beginTest ("Construction");
|
||||
{
|
||||
OSCBundle bundle;
|
||||
expect (bundle.getTimeTag().isImmediately());
|
||||
}
|
||||
|
||||
beginTest ("Construction with time tag");
|
||||
{
|
||||
Time in100Seconds = (Time (Time::currentTimeMillis()) + RelativeTime (100.0));
|
||||
OSCBundle bundle (in100Seconds);
|
||||
expect (! bundle.getTimeTag().isImmediately());
|
||||
expect (bundle.getTimeTag().toTime() == in100Seconds);
|
||||
}
|
||||
|
||||
beginTest ("Usage when containing messages");
|
||||
{
|
||||
OSCBundle testBundle = generateTestBundle();
|
||||
expectBundleEqualsTestBundle (testBundle);
|
||||
|
||||
}
|
||||
|
||||
beginTest ("Usage when containing other bundles (recursively)");
|
||||
{
|
||||
OSCBundle complexTestBundle;
|
||||
complexTestBundle.addElement (generateTestBundle());
|
||||
complexTestBundle.addElement (OSCMessage ("/test/"));
|
||||
complexTestBundle.addElement (generateTestBundle());
|
||||
|
||||
expect (complexTestBundle.size() == 3);
|
||||
|
||||
OSCBundle::Element* elements = complexTestBundle.begin();
|
||||
|
||||
expect (! elements[0].isMessage());
|
||||
expect (elements[0].isBundle());
|
||||
expect (elements[1].isMessage());
|
||||
expect (! elements[1].isBundle());
|
||||
expect (! elements[2].isMessage());
|
||||
expect (elements[2].isBundle());
|
||||
|
||||
expectBundleEqualsTestBundle (elements[0].getBundle());
|
||||
expect (elements[1].getMessage().size() == 0);
|
||||
expect (elements[1].getMessage().getAddressPattern().toString() == "/test");
|
||||
expectBundleEqualsTestBundle (elements[2].getBundle());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int testInt = 127;
|
||||
float testFloat = 1.5;
|
||||
|
||||
OSCBundle generateTestBundle()
|
||||
{
|
||||
OSCBundle bundle;
|
||||
|
||||
OSCMessage msg1 ("/test/fader");
|
||||
msg1.addInt32 (testInt);
|
||||
|
||||
OSCMessage msg2 ("/test/foo");
|
||||
msg2.addString ("bar");
|
||||
msg2.addFloat32 (testFloat);
|
||||
|
||||
bundle.addElement (msg1);
|
||||
bundle.addElement (msg2);
|
||||
|
||||
return bundle;
|
||||
}
|
||||
|
||||
void expectBundleEqualsTestBundle (const OSCBundle& bundle)
|
||||
{
|
||||
expect (bundle.size() == 2);
|
||||
expect (bundle[0].isMessage());
|
||||
expect (! bundle[0].isBundle());
|
||||
expect (bundle[1].isMessage());
|
||||
expect (! bundle[1].isBundle());
|
||||
|
||||
int numElementsCounted = 0;
|
||||
for (auto& element : bundle)
|
||||
{
|
||||
expect (element.isMessage());
|
||||
expect (! element.isBundle());
|
||||
++numElementsCounted;
|
||||
}
|
||||
expectEquals (numElementsCounted, 2);
|
||||
|
||||
auto* e = bundle.begin();
|
||||
expect (e[0].getMessage().size() == 1);
|
||||
expect (e[0].getMessage().begin()->getInt32() == testInt);
|
||||
expect (e[1].getMessage().size() == 2);
|
||||
expect (e[1].getMessage()[1].getFloat32() == testFloat);
|
||||
}
|
||||
};
|
||||
|
||||
static OSCBundleTests OSCBundleUnitTests;
|
||||
|
||||
//==============================================================================
|
||||
class OSCBundleElementTests : public UnitTest
|
||||
{
|
||||
public:
|
||||
OSCBundleElementTests()
|
||||
: UnitTest ("OSCBundle::Element class", UnitTestCategories::osc)
|
||||
{}
|
||||
|
||||
void runTest()
|
||||
{
|
||||
beginTest ("Construction from OSCMessage");
|
||||
{
|
||||
float testFloat = -0.125;
|
||||
OSCMessage msg ("/test");
|
||||
msg.addFloat32 (testFloat);
|
||||
|
||||
OSCBundle::Element element (msg);
|
||||
|
||||
expect (element.isMessage());
|
||||
expect (element.getMessage().size() == 1);
|
||||
expect (element.getMessage()[0].getType() == OSCTypes::float32);
|
||||
expect (element.getMessage()[0].getFloat32() == testFloat);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static OSCBundleElementTests OSCBundleElementUnitTests;
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace juce
|
Reference in New Issue
Block a user