// { dg-do compile }
// { dg-require-effective-target fpic }
// { dg-require-visibility "" }
// { dg-options "-fPIC -Wno-return-type" }


typedef __SIZE_TYPE__ size_t;
extern "C" void *
malloc (size_t __size)
throw () __attribute__ ((__malloc__));
     namespace std __attribute__ ((__visibility__ ("default")))
{
  using::size_t;
}
inline void *operator
new (std::size_t, void *__p)
throw ()
{
  return __p;
}
template < class _T1, class _T2 > struct pair
{
  _T1 first;
  _T2 second;
    pair (const _T1 & __a, const _T2 & __b):first (__a), second (__b)
  {
  }
  template < class _U1, class _U2 >
    pair (const pair < _U1, _U2 > &__p):first (__p.first), second (__p.second)
  {
  }
};

template < class _T1, class _T2 >
  inline pair < _T1, _T2 > make_pair (_T1 __x, _T2 __y)
{
  return pair < _T1, _T2 > (__x, __y);
}
template < typename _Tp > inline const _Tp &
max (const _Tp & __a, const _Tp & __b)
{
}
typedef unsigned short int uint16_t;
typedef unsigned long int uintptr_t;
typedef uint16_t UChar;
namespace std __attribute__ ((__visibility__ ("default")))
{
  struct __numeric_limits_base
  {
  };
  template < typename _Tp > struct numeric_limits:public __numeric_limits_base
  {
    static _Tp max () throw ()
    {
    }
  };
}

template < typename T > class VectorBufferBase
{
public:
  void allocateBuffer (size_t newCapacity)
  {
    if (newCapacity > std::numeric_limits < size_t >::max () / sizeof (T))
      *(int *) (uintptr_t) 0xbbadbeef = 0;
  }
};

template < typename T, size_t inlineCapacity > class VectorBuffer;
template < typename T > class VectorBuffer < T, 0 >:private VectorBufferBase <
  T >
{
public:
  typedef VectorBufferBase < T > Base;
  using Base::allocateBuffer;
};

template < typename T, size_t inlineCapacity = 0 > class Vector
{
  typedef VectorBuffer < T, inlineCapacity > Impl;
public:
  typedef T *iterator;
  size_t size () const
  {
    return m_size;
  }
  size_t capacity () const
  {
  }
  iterator begin ()
  {
  }
  iterator end ()
  {
    return begin () + m_size;
  }
  void shrink (size_t size);
  void reserveCapacity (size_t newCapacity);
  void clear ()
  {
    shrink (0);
  }
  template < typename U > void append (const U &);
  void expandCapacity (size_t newMinCapacity);
  template < typename U > U * expandCapacity (size_t newMinCapacity, U *);
  size_t m_size;
  Impl m_impl;
};
template < typename T, size_t inlineCapacity >
  void Vector < T, inlineCapacity >::expandCapacity (size_t newMinCapacity)
{
  reserveCapacity (max
		   (newMinCapacity,
		    max (static_cast < size_t > (16),
			 capacity () + capacity () / 4 + 1)));
}

template < typename T, size_t inlineCapacity >
  template < typename U >
  inline U * Vector < T,
  inlineCapacity >::expandCapacity (size_t newMinCapacity, U * ptr)
{
  expandCapacity (newMinCapacity);
}
template < typename T, size_t inlineCapacity >
  void Vector < T, inlineCapacity >::reserveCapacity (size_t newCapacity)
{
  m_impl.allocateBuffer (newCapacity);
}
template < typename T, size_t inlineCapacity >
  template < typename U >
  inline void Vector < T, inlineCapacity >::append (const U & val)
{
  const U *ptr = &val;
  if (size () == capacity ())
    ptr = expandCapacity (size () + 1, ptr);
  new (end ())T (*ptr);
}

class Range;
class TextIterator
{
public:
  explicit TextIterator (const Range *,
			 bool emitCharactersBetweenAllVisiblePositions =
			 false);
  bool atEnd () const
  {
  }
  void advance ();
  int length () const
  {
  }
};
UChar *
plainTextToMallocAllocatedBuffer (const Range * r, unsigned &bufferLength)
{
  static const unsigned cMaxSegmentSize = 1 << 16;
  typedef pair < UChar *, unsigned >TextSegment;
  Vector < TextSegment > *textSegments = 0;
  Vector < UChar > textBuffer;
  for (TextIterator it (r); !it.atEnd (); it.advance ())
    {
      if (textBuffer.size ()
	  && textBuffer.size () + it.length () > cMaxSegmentSize)
	{
	  UChar *newSegmentBuffer =
	    static_cast <
	    UChar * >(malloc (textBuffer.size () * sizeof (UChar)));
	  if (!textSegments)
	    textSegments = new Vector < TextSegment >;
	  textSegments->
	    append (make_pair (newSegmentBuffer, textBuffer.size ()));
	  textBuffer.clear ();
	}
    }
}
