// { dg-do assemble }
|
// { dg-do assemble }
|
// PRMS id: g++/13340
|
// PRMS id: g++/13340
|
|
|
class rectangle {
|
class rectangle {
|
|
|
public:
|
public:
|
rectangle();
|
rectangle();
|
int overlaps() const;
|
int overlaps() const;
|
|
|
};
|
};
|
|
|
class region
|
class region
|
{
|
{
|
friend class region_impl;
|
friend class region_impl;
|
|
|
public:
|
public:
|
region();
|
region();
|
typedef int (region::* region_func)() const;
|
typedef int (region::* region_func)() const;
|
|
|
};
|
};
|
|
|
class region_impl {
|
class region_impl {
|
friend class region;
|
friend class region;
|
|
|
private:
|
private:
|
rectangle content, mbb;
|
rectangle content, mbb;
|
region_impl *link_p;
|
region_impl *link_p;
|
region_impl(const rectangle &content);
|
region_impl(const rectangle &content);
|
|
|
public:
|
public:
|
int iterate(region *region_p, region::region_func what,
|
int iterate(region *region_p, region::region_func what,
|
const rectangle &clip_rect) const;
|
const rectangle &clip_rect) const;
|
int iterate(region *region_p, region::region_func what,
|
int iterate(region *region_p, region::region_func what,
|
const region_impl &clip_rgn) const;
|
const region_impl &clip_rgn) const;
|
};
|
};
|
|
|
|
|
int
|
int
|
region_impl::iterate (region *region_p, region::region_func what,
|
region_impl::iterate (region *region_p, region::region_func what,
|
const rectangle &clip_rect) const
|
const rectangle &clip_rect) const
|
{
|
{
|
for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
|
for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
|
p = p->link_p)
|
p = p->link_p)
|
if (p->content.overlaps())
|
if (p->content.overlaps())
|
if (!(region_p->*what)()) return 0;
|
if (!(region_p->*what)()) return 0;
|
return 1;
|
return 1;
|
}
|
}
|
|
|
int
|
int
|
region_impl::iterate (region *region_p, region::region_func what,
|
region_impl::iterate (region *region_p, region::region_func what,
|
const region_impl &clip_rgn) const
|
const region_impl &clip_rgn) const
|
{
|
{
|
for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
|
for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
|
p = p->link_p)
|
p = p->link_p)
|
if (!clip_rgn.iterate(region_p, what, p->content)) return 0;
|
if (!clip_rgn.iterate(region_p, what, p->content)) return 0;
|
return 1;
|
return 1;
|
}
|
}
|
|
|