// PR target/34403
|
// PR target/34403
|
// Origin: Martin Michlmayr
|
// Origin: Martin Michlmayr
|
|
|
// { dg-do compile }
|
// { dg-do compile }
|
// { dg-options "-O" }
|
// { dg-options "-O" }
|
|
|
typedef unsigned char uint8_t;
|
typedef unsigned char uint8_t;
|
typedef uint8_t uint8;
|
typedef uint8_t uint8;
|
__extension__ typedef __SIZE_TYPE__ size_t;
|
__extension__ typedef __SIZE_TYPE__ size_t;
|
class csVector2
|
class csVector2
|
{
|
{
|
public:float x;
|
public:float x;
|
};
|
};
|
class csBox2
|
class csBox2
|
{
|
{
|
};
|
};
|
struct iBase
|
struct iBase
|
{
|
{
|
};
|
};
|
struct iClipper2D:public virtual iBase
|
struct iClipper2D:public virtual iBase
|
{
|
{
|
};
|
};
|
template < class Class > class scfImplementation:public virtual iBase
|
template < class Class > class scfImplementation:public virtual iBase
|
{
|
{
|
};
|
};
|
template < class Class, class I1 > class scfImplementation1:public
|
template < class Class, class I1 > class scfImplementation1:public
|
scfImplementation < Class >,
|
scfImplementation < Class >,
|
public I1
|
public I1
|
{
|
{
|
};
|
};
|
class csClipper:public scfImplementation1 < csClipper, iClipper2D >
|
class csClipper:public scfImplementation1 < csClipper, iClipper2D >
|
{
|
{
|
};
|
};
|
class csBoxClipper:public csClipper
|
class csBoxClipper:public csClipper
|
{
|
{
|
csBox2 region;
|
csBox2 region;
|
virtual uint8 Clip (csVector2 * InPolygon, size_t InCount,
|
virtual uint8 Clip (csVector2 * InPolygon, size_t InCount,
|
csVector2 * OutPolygon, size_t & OutCount);
|
csVector2 * OutPolygon, size_t & OutCount);
|
};
|
};
|
struct StatusOutputNone
|
struct StatusOutputNone
|
{
|
{
|
};
|
};
|
namespace CS
|
namespace CS
|
{
|
{
|
template < typename BoxTest, typename StatusOutput > class BoxClipper
|
template < typename BoxTest, typename StatusOutput > class BoxClipper
|
{
|
{
|
BoxTest boxTest;
|
BoxTest boxTest;
|
StatusOutput statOut;
|
StatusOutput statOut;
|
const csBox2 & region;
|
const csBox2 & region;
|
csVector2 *InP;
|
csVector2 *InP;
|
size_t InV;
|
size_t InV;
|
csVector2 *OutP;
|
csVector2 *OutP;
|
size_t OutV;
|
size_t OutV;
|
public: BoxClipper (const BoxTest & boxTest, const StatusOutput & statOut,
|
public: BoxClipper (const BoxTest & boxTest, const StatusOutput & statOut,
|
const csBox2 & region, csVector2 * InP, size_t InV,
|
const csBox2 & region, csVector2 * InP, size_t InV,
|
csVector2 * OutP):boxTest (boxTest), statOut (statOut),
|
csVector2 * OutP):boxTest (boxTest), statOut (statOut),
|
region (region), InP (InP), InV (InV), OutP (OutP), OutV (-1)
|
region (region), InP (InP), InV (InV), OutP (OutP), OutV (-1)
|
{
|
{
|
}
|
}
|
uint8 Clip ()
|
uint8 Clip ()
|
{
|
{
|
__builtin_memcpy (this->OutP, InP, OutV * sizeof (csVector2));
|
__builtin_memcpy (this->OutP, InP, OutV * sizeof (csVector2));
|
}
|
}
|
};
|
};
|
}
|
}
|
struct BoxTestAll
|
struct BoxTestAll
|
{
|
{
|
};
|
};
|
uint8
|
uint8
|
csBoxClipper::Clip (csVector2 * InPolygon, size_t InCount,
|
csBoxClipper::Clip (csVector2 * InPolygon, size_t InCount,
|
csVector2 * OutPolygon, size_t & OutCount)
|
csVector2 * OutPolygon, size_t & OutCount)
|
{
|
{
|
BoxTestAll b;
|
BoxTestAll b;
|
StatusOutputNone n;
|
StatusOutputNone n;
|
CS::BoxClipper < BoxTestAll, StatusOutputNone > boxClip (b, n, region,
|
CS::BoxClipper < BoxTestAll, StatusOutputNone > boxClip (b, n, region,
|
InPolygon, InCount,
|
InPolygon, InCount,
|
OutPolygon);
|
OutPolygon);
|
uint8 Clipped = boxClip.Clip ();
|
uint8 Clipped = boxClip.Clip ();
|
}
|
}
|
|
|