// RUN: %llvmgxx -S %s -o -
// PR1634

namespace Manta
{
  class CallbackHandle
  {
  protected:virtual ~ CallbackHandle (void)
    {
    }
  };
template < typename Data1 > class CallbackBase_1Data:public CallbackHandle
  {
  };
}

namespace __gnu_cxx
{
  template < typename _Iterator, typename _Container >
  class __normal_iterator
  {
    _Iterator _M_current;
  };
}

namespace std
{
  template < typename _Tp > struct allocator
  {
    typedef _Tp *pointer;
  };
  template < typename _InputIterator,
    typename _Tp > inline void find (_InputIterator __last,
					       const _Tp & __val)
  {
  };
}

namespace Manta
{
  template < typename _Tp, typename _Alloc> struct _Vector_base
  {
    struct _Vector_impl
    {
      _Tp *_M_start;
    };
  public:
    _Vector_impl _M_impl;
  };
  template < typename _Tp, typename _Alloc = std::allocator < _Tp > >
  class vector:protected _Vector_base < _Tp,_Alloc >
  {
  public:
    typedef __gnu_cxx::__normal_iterator < typename _Alloc::pointer,
      vector < _Tp, _Alloc > > iterator;
    iterator end ()
    {
    }
  };
  class MantaInterface
  {
  };
  class RTRT
  {
    virtual CallbackHandle *registerTerminationCallback (CallbackBase_1Data <
							 MantaInterface * >*);
    virtual void unregisterCallback (CallbackHandle *);
    typedef vector < CallbackBase_1Data < int >*>PRCallbackMapType;
    PRCallbackMapType parallelPreRenderCallbacks;
  };
}
using namespace Manta;
CallbackHandle *
RTRT::registerTerminationCallback (CallbackBase_1Data < MantaInterface * >*cb)
{
  return cb;
}

void
RTRT::unregisterCallback (CallbackHandle * callback)
{
  {
    typedef CallbackBase_1Data < int > callback_t;
    callback_t *cb = static_cast < callback_t * >(callback);
    find (parallelPreRenderCallbacks.end (), cb);
  }
}

