|
- /*
- ==============================================================================
-
- 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.
-
- The code included in this file is provided under the terms of the ISC license
- http://www.isc.org/downloads/software-support-policy/isc-license. 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.
-
- 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
- {
-
- /** Describes a physical connection between two ports of two block devices.
-
- @tags{Blocks}
- */
- struct BlockDeviceConnection
- {
- Block::UID device1, device2;
- Block::ConnectionPort connectionPortOnDevice1, connectionPortOnDevice2;
-
- bool operator== (const BlockDeviceConnection&) const noexcept;
- bool operator!= (const BlockDeviceConnection&) const noexcept;
- };
-
-
- /** Describes a set of blocks and the connections between them.
-
- @tags{Blocks}
- */
- struct BlockTopology
- {
- Block::Array blocks;
- Array<BlockDeviceConnection> connections;
-
- bool operator== (const BlockTopology&) const noexcept;
- bool operator!= (const BlockTopology&) const noexcept;
-
- Block::Ptr getBlockWithUID (Block::UID deviceID)
- {
- for (auto&& block : blocks)
- if (block->uid == deviceID)
- return block;
-
- return {};
- }
-
- const Block::Ptr getBlockWithUID (Block::UID deviceID) const
- {
- for (auto&& block : blocks)
- if (block->uid == deviceID)
- return block;
-
- return {};
- }
-
- Block::Array getDirectlyConnectedBlocks (Block::UID blockUID) const
- {
- Block::Array connectedBlocks;
-
- for (const auto& connection : connections)
- {
- auto connectedDeviceUID = Block::UID { 0 };
-
- if (connection.device1 == blockUID)
- connectedDeviceUID = connection.device2;
-
- else if (connection.device2 == blockUID)
- connectedDeviceUID = connection.device1;
-
- if (connectedDeviceUID != Block::UID { 0 })
- if (auto newBlock = getBlockWithUID (connectedDeviceUID))
- connectedBlocks.addIfNotAlreadyThere (newBlock);
- }
-
- return connectedBlocks;
- }
-
- Array<BlockDeviceConnection> getConnectionsBetweenBlocks (Block::UID uid1, Block::UID uid2) const
- {
- Array<BlockDeviceConnection> blockConnections;
-
- for (const auto& connection : connections)
- {
- if ((connection.device1 == uid1 && connection.device2 == uid2)
- || (connection.device1 == uid2 && connection.device2 == uid1))
- {
- blockConnections.add (connection);
- }
- }
-
- return blockConnections;
- }
-
- int getNumberOfConnectionsToBlock (Block::UID uid) const
- {
- int connectionCount = 0;
-
- for (const auto& connection : connections)
- if (connection.device1 == uid || connection.device2 == uid)
- ++connectionCount;
-
- return connectionCount;
- }
- };
-
- } // namespace juce
|