blob: 44f2d5c58ee6de5737f7525568f855b6aea5542e [file] [log] [blame]
// { 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 ();
}
}
}