lumiera_/src/proc/mobject/output-designation.cpp

199 lines
6.2 KiB
C++

/*
OutputDesignation - specifying a desired output destination
Copyright (C) Lumiera.org
2010, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file output-designation.cpp
** Implementation details of OutputDesignation and OutputMapping.
** Both of these are mostly intended as interface elements to represent
** the intention to connect to another MObject, or a translation and mapping
** of such connection intentions. But parts of the implementation are kept
** here in a translation unit separate of the usage site: The implementation
** of the various kinds of OutputDesignation spec (absolute, indirect, relative)
** and the connection between OutputMapping and the rules based system.
**
** @see OutputDesignation
** @see OutputMapping
** @see OutputMapping_test
**
*/
#include "lib/error.hpp"
#include "lib/symbol.hpp"
#include "proc/mobject/mobject.hpp"
#include "proc/mobject/placement-ref.hpp"
#include "proc/mobject/output-designation.hpp"
#include "proc/mobject/output-mapping.hpp"
#include "common/configrules.hpp"
#include <boost/functional/hash.hpp>
#include <cstdlib>
using lumiera::query::QueryHandler;
using lumiera::ConfigRules;
using lumiera::Symbol;
using lib::query::removeTerm;
using lib::query::extractID;
namespace proc {
namespace mobject {
typedef OutputDesignation::PPipe PPipe;
typedef OutputDesignation::PID PID;
typedef OutputDesignation::TargetSpec TargetSpec;
struct AbsoluteSpec
: TargetSpec
{
PID target_;
AbsoluteSpec (PID explicitTarget)
: target_(explicitTarget)
{ }
PID resolve (PPipe) { return target_; }
};
struct IndirectSpec
: TargetSpec
{
RefPlacement mediator_;
IndirectSpec (RefPlacement const& indirectTarget)
: mediator_(indirectTarget)
{ }
PID
resolve (PPipe)
{
REQUIRE (mediator_);
UNIMPLEMENTED ("how to query a placement for output designation");
}
};
struct RelativeSpec
: TargetSpec
{
uint busNr_;
RelativeSpec (uint relative_busNr)
: busNr_(relative_busNr)
{ }
PID
resolve (PPipe)
{
UNIMPLEMENTED ("how the hell can we get a grip on the target to resolve the bus??");
}
};
OutputDesignation::TargetSpec::~TargetSpec() { }
/** create an output designation by directly
* specifying the target to connect
*/
OutputDesignation::OutputDesignation (PID explicitTarget)
: spec_(AbsoluteSpec (explicitTarget))
{ }
/** create an output designation indirectly
* to be resolved by forwarding the resolution
* to the given reference scope / mediator.
*/
OutputDesignation::OutputDesignation (RefPlacement const& indirectTarget)
: spec_(IndirectSpec (indirectTarget))
{ }
/** create an output designation by relative specification,
* to be resolved based on the stream type and the actual
* default target object at hand when resolving.
* @param relative_busNr within the collection of target pipes
* available for the actual stream type to connect
* @note as the relative bus/pipe number defaults to 0,
* effectively this becomes a default ctor, denoting
* "connect me to the first bus suitable for my stream type"
*/
OutputDesignation::OutputDesignation (uint relative_busNr)
: spec_(RelativeSpec (relative_busNr))
{ }
namespace _mapping {
/** @internal to allow for the use of queries mixed with normal Pipe-IDs
* in a single table, we rely on the \c hash_value() function, to be
* picked up by ADL */
HashVal
slot (Query<asset::Pipe> const& query)
{
return hash_value (query);
}
/** @param Query for pipe, which is handed over as-is to the rules engine.
* @return key for a table slot to hold the associated mapping. This slot
* is assumed to contain the mapped Pipe-ID for the given
* query -- including the possibility of a zero hash
* to signal an \em unconnected mapping. */
HashVal
resolveQuery (Query<asset::Pipe> const& query4pipe)
{
PPipe res;
QueryHandler<asset::Pipe>& typeHandler = ConfigRules::instance();
typeHandler.resolve (res, query4pipe);
HashVal resulting_targetPipeID (res? (HashVal)res->getID() : 0 );
return resulting_targetPipeID;
}
Symbol SEQNR_PREDICATE = "ord";
uint
is_defaults_query_with_channel (Query<asset::Pipe> const& query4pipe)
{
string seqNr = "TODO";//extractID (SEQNR_PREDICATE, query4pipe);////////////////////////////////////////////////////////////////////////////////////////////TODO
UNIMPLEMENTED ("Query remolding");////////////////////////////////////////////////////////////////////////////////////////////TODO
return abs(std::atoi (seqNr.c_str())); // also 0 in case of an invalid number
}
Query<asset::Pipe>
build_corresponding_sourceQuery (Query<asset::Pipe> const& query4pipe)
{
Query<asset::Pipe> srcQuery = query4pipe;
// removeTerm (SEQNR_PREDICATE, srcQuery);////////////////////////////////////////////////////////////////////////////////////////////TODO
UNIMPLEMENTED ("Query remolding");////////////////////////////////////////////////////////////////////////////////////////////TODO
return srcQuery;
}
}
}} // namespace mobject