bool m_owned;
};
-// this has to be defined inside the DLL (and not e.g. as a static variable
-// inside an inline function) as otherwise MSVC gives link errors when the
-// functions are effectively inlined (i.e. in non-debug build)
-//
// NB: this is defined in string.cpp and not the (non-existent) buffer.cpp
-extern WXDLLIMPEXP_DATA_BASE(UntypedBufferData * const) untypedNullDataPtr;
+WXDLLIMPEXP_BASE UntypedBufferData * GetUntypedNullData();
} // namespace wxPrivate
// Creates "owned" buffer, i.e. takes over ownership of 'str' and frees it
// in dtor (if ref.count reaches 0).
static
- const wxScopedCharTypeBuffer CreateOwned(const CharType *str,
+ const wxScopedCharTypeBuffer CreateOwned(CharType *str,
size_t len = wxNO_LEN )
{
if ( len == wxNO_LEN )
wxScopedCharTypeBuffer buf;
if ( str )
- buf.m_data = new Data(StrCopy(str, len), len);
+ buf.m_data = new Data(str, len);
return buf;
}
// placeholder for NULL string, to simplify this code
static Data *GetNullData()
{
- return static_cast<Data *>(wxPrivate::untypedNullDataPtr);
+ return static_cast<Data *>(wxPrivate::GetUntypedNullData());
}
void IncRef()
wxCharBuffer(const wxCStrData& cstr);
};
-#if wxUSE_WCHAR_T
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxScopedCharTypeBuffer<wchar_t> )
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer<wchar_t> )
wxWCharBuffer(const wxCStrData& cstr);
};
-#endif // wxUSE_WCHAR_T
// wxCharTypeBuffer<T> implicitly convertible to T*
template <typename T>
delete this;
}
+ void *release()
+ {
+ if ( m_data == NULL )
+ return NULL;
+
+ wxASSERT_MSG( m_ref == 1, "can't release shared buffer" );
+
+ void *p = m_data;
+ m_data = NULL;
+ m_len =
+ m_size = 0;
+
+ return p;
+ }
+
// the buffer containing the data
void *m_data;
operator const char *() const { return (const char*)GetData(); }
+ // gives up ownership of data, returns the pointer; after this call,
+ // data isn't freed by the buffer and its content is resent to empty
+ void *release()
+ {
+ return m_bufdata->release();
+ }
+
private:
wxMemoryBufferData* m_bufdata;
};