#include <iostream>
static const std::size_t offset_type_alignment = 0;
template<class T, class U>
struct pointer_to_other;
template<class T, class U, template<class> class Sp>
struct pointer_to_other< Sp<T>, U >
{
typedef Sp<U> type;
};
template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
class offset_ptr
{
};
template <class T, class DifferenceType = std::ptrdiff_t, class OffsetType = std::size_t, std::size_t Alignment = offset_type_alignment>
class offset_ptr;
template<class T, class T2, class T3, std::size_t A, class U>
struct pointer_to_other<offset_ptr<T, T2, T3, A>, U >
{
typedef offset_ptr<U, T2, T3, A> type;
};
template<class VoidPointer>
class message_queue_t
{
typedef VoidPointer void_pointer;
typedef typename pointer_to_other<void_pointer, char>::type char_ptr;
};
int main()
{
message_queue_t< offset_ptr<void, std::ptrdiff_t, std::size_t, offset_type_alignment> > test;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3Qgb2Zmc2V0X3R5cGVfYWxpZ25tZW50ID0gMDsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CnN0cnVjdCBwb2ludGVyX3RvX290aGVyOwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFNwPgpzdHJ1Y3QgcG9pbnRlcl90b19vdGhlcjwgU3A8VD4sIFUgPgp7CiAgIHR5cGVkZWYgU3A8VT4gdHlwZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBQb2ludGVkVHlwZSwgY2xhc3MgRGlmZmVyZW5jZVR5cGUsIGNsYXNzIE9mZnNldFR5cGUsIHN0ZDo6c2l6ZV90IE9mZnNldEFsaWdubWVudD4KY2xhc3Mgb2Zmc2V0X3B0cgp7Cn07CnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEaWZmZXJlbmNlVHlwZSA9IHN0ZDo6cHRyZGlmZl90LCBjbGFzcyBPZmZzZXRUeXBlID0gc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90IEFsaWdubWVudCA9IG9mZnNldF90eXBlX2FsaWdubWVudD4KY2xhc3Mgb2Zmc2V0X3B0cjsKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUMiwgY2xhc3MgVDMsIHN0ZDo6c2l6ZV90IEEsIGNsYXNzIFU+CnN0cnVjdCBwb2ludGVyX3RvX290aGVyPG9mZnNldF9wdHI8VCwgVDIsIFQzLCBBPiwgVSA+CnsKICAgdHlwZWRlZiBvZmZzZXRfcHRyPFUsIFQyLCBUMywgQT4gdHlwZTsKfTsKCgp0ZW1wbGF0ZTxjbGFzcyBWb2lkUG9pbnRlcj4KY2xhc3MgbWVzc2FnZV9xdWV1ZV90CnsKICAgdHlwZWRlZiBWb2lkUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkX3BvaW50ZXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90b19vdGhlcjx2b2lkX3BvaW50ZXIsIGNoYXI+Ojp0eXBlCSAgICAgICBjaGFyX3B0cjsKfTsKCmludCBtYWluKCkKewptZXNzYWdlX3F1ZXVlX3Q8IG9mZnNldF9wdHI8dm9pZCwgc3RkOjpwdHJkaWZmX3QsIHN0ZDo6c2l6ZV90LCBvZmZzZXRfdHlwZV9hbGlnbm1lbnQ+ID4gdGVzdDsKCgp9