Optimizer - Replace constant inputs with constants
This commit is contained in:
parent
8f21177058
commit
3de17b918d
3 changed files with 47 additions and 6 deletions
23
c-opopt.cc
23
c-opopt.cc
|
@ -135,12 +135,23 @@ P_ExpressionNode T_ConstantFolder_::checkExpression(
|
|||
|
||||
// Replace inputs with value if no curve/constant curve
|
||||
if ( node.type( ) == A_Node::EXPR_INPUT ) {
|
||||
// TODO: may be replaced with either a constant or a variable.
|
||||
// * If the curve exists and describes a constant, it's a
|
||||
// constant
|
||||
// * If there is no curve and only one default value in the
|
||||
// whole program then it's also a constant
|
||||
// * No curve, multiple defaults -> variable
|
||||
if ( !curves ) {
|
||||
return {};
|
||||
}
|
||||
|
||||
auto& n{ (T_InputExprNode&) node };
|
||||
auto const* const curve{ curves->curves.get( n.id( ) ) };
|
||||
if ( curve ) {
|
||||
// Curve present, check if it's constant
|
||||
const auto cval{ curve->isConstant( ) };
|
||||
if ( !cval ) {
|
||||
return {};
|
||||
}
|
||||
return NewOwned< T_ConstantExprNode >( node.parent( ) , *cval );
|
||||
}
|
||||
|
||||
// TODO: check whether there's only one default value; if that's the case,
|
||||
// well, we got ourselves a constant.
|
||||
return {};
|
||||
}
|
||||
|
||||
|
|
23
c-sync.cc
23
c-sync.cc
|
@ -214,6 +214,17 @@ float T_SyncSegment::computeValue(
|
|||
return v * ( values[ part + 1 ] - sv ) + sv;
|
||||
}
|
||||
|
||||
T_Optional< float > T_SyncSegment::isConstant( ) const noexcept
|
||||
{
|
||||
const float f{ values[ 0 ] };
|
||||
for ( auto v : values ) {
|
||||
if ( f != v ) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
M_LSHIFT_OP( T_StringBuilder , T_SyncSegment::E_SegmentType )
|
||||
{
|
||||
switch ( value ) {
|
||||
|
@ -297,6 +308,18 @@ uint32_t T_SyncCurve::points( ) const noexcept
|
|||
return np;
|
||||
}
|
||||
|
||||
T_Optional< float > T_SyncCurve::isConstant( ) const noexcept
|
||||
{
|
||||
T_Optional< float > v;
|
||||
for ( auto const& s : segments ) {
|
||||
v = s.isConstant( );
|
||||
if ( !v ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
/*= T_SyncCurves =============================================================*/
|
||||
|
||||
|
|
|
@ -48,6 +48,9 @@ struct T_SyncSegment
|
|||
// Compute the value for the specified position, which is relative
|
||||
// to the start of the segment.
|
||||
float computeValue( float relTimeUnits ) const noexcept;
|
||||
|
||||
// Is the segment constant? If it is, return the value.
|
||||
T_Optional< float > isConstant( ) const noexcept;
|
||||
};
|
||||
M_LSHIFT_OP( T_StringBuilder , T_SyncSegment::E_SegmentType );
|
||||
|
||||
|
@ -106,6 +109,10 @@ struct T_SyncCurve
|
|||
// inside a segment, or the first and last value in the curve, or
|
||||
// a junction between segments.
|
||||
uint32_t points( ) const noexcept;
|
||||
|
||||
// Does the curve represent a constant? It does if all values in
|
||||
// all segments are identical; in that case the value is returned.
|
||||
T_Optional< float > isConstant( ) const noexcept;
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
|
Loading…
Reference in a new issue