/************************************************************************
 *
 * 27.stringbuf.str.stdcxx-514.cpp - test case from STDCXX-514 issue
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 * 
 **************************************************************************/

#include <sstream>  // for stringbuf
#include <memory>   // for allocator

#include <cassert>  // for assert()

char extbuf [3];

struct MyAlloc : std::allocator <char>
{
    pointer allocate (size_type __n, std::allocator<void>::const_pointer = 0) {
        return new char [__n];
    }

    void deallocate (pointer __p, size_type)
    {
        assert (extbuf != __p);
        delete [] __p;
    }
};

int main ()
{
    std::basic_stringbuf <char, std::char_traits <char>, MyAlloc> sbuf;

    sbuf.pubsetbuf (extbuf, sizeof (extbuf));

    const char* str = "abcdef";
    sbuf.str (str);
    assert (sbuf.str () == str);

    return 0;
}
