// PRMS id: g++/13340
// Build don't link:

class rectangle {
    
public:
  rectangle();
  int overlaps() const;

};

class region 
{
  friend class region_impl;

public:
  region();
  typedef int (region::* region_func)() const;      

};

class region_impl  {
  friend class region;

private:
  rectangle content, mbb;
  region_impl *link_p;
  region_impl(const rectangle &content);

public:
  int iterate(region *region_p, region::region_func what,
	      const rectangle &clip_rect) const;
  int iterate(region *region_p, region::region_func what,
	      const region_impl &clip_rgn) const;
};


int
region_impl::iterate (region *region_p, region::region_func what, 
		      const rectangle &clip_rect) const
{
  for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
       p = p->link_p)
    if (p->content.overlaps())
      if (!(region_p->*what)()) return 0;
  return 1;
}

int
region_impl::iterate (region *region_p, region::region_func what,
		      const region_impl &clip_rgn) const
{
  for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
       p = p->link_p)
    if (!clip_rgn.iterate(region_p, what, p->content)) return 0;
  return 1;
}
