gecko-dev/xpcom/ds/nsUnicharBuffer.cpp

105 строки
2.2 KiB
C++
Исходник Обычный вид История

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2012-05-21 15:12:37 +04:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
1999-05-26 05:38:36 +04:00
#include "nsUnicharBuffer.h"
1998-04-14 00:24:54 +04:00
#include "nsCRT.h"
#include "nsAutoPtr.h"
1998-04-14 00:24:54 +04:00
#define MIN_BUFFER_SIZE 32
1999-05-26 05:38:36 +04:00
UnicharBufferImpl::UnicharBufferImpl()
: mBuffer(NULL), mSpace(0), mLength(0)
{
}
NS_METHOD
UnicharBufferImpl::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsRefPtr<UnicharBufferImpl> it = new UnicharBufferImpl();
1999-05-26 05:38:36 +04:00
return it->QueryInterface(aIID, aResult);
1999-05-26 05:38:36 +04:00
}
NS_IMETHODIMP
UnicharBufferImpl::Init(uint32_t aBufferSize)
1998-04-14 00:24:54 +04:00
{
if (aBufferSize < MIN_BUFFER_SIZE) {
1998-04-14 00:24:54 +04:00
aBufferSize = MIN_BUFFER_SIZE;
}
mSpace = aBufferSize;
mLength = 0;
1999-05-26 05:38:36 +04:00
mBuffer = new PRUnichar[aBufferSize];
return NS_OK;
1998-04-14 00:24:54 +04:00
}
NS_IMPL_ISUPPORTS1(UnicharBufferImpl, nsIUnicharBuffer)
1998-04-14 00:24:54 +04:00
UnicharBufferImpl::~UnicharBufferImpl()
{
if (nullptr != mBuffer) {
delete[] mBuffer;
mBuffer = nullptr;
1998-04-14 00:24:54 +04:00
}
mLength = 0;
}
NS_IMETHODIMP_(int32_t)
1999-05-26 05:38:36 +04:00
UnicharBufferImpl::GetLength() const
1998-04-14 00:24:54 +04:00
{
return mLength;
}
NS_IMETHODIMP_(int32_t)
1999-05-26 05:38:36 +04:00
UnicharBufferImpl::GetBufferSize() const
1998-04-14 00:24:54 +04:00
{
return mSpace;
}
1999-05-26 05:38:36 +04:00
NS_IMETHODIMP_(PRUnichar*)
UnicharBufferImpl::GetBuffer() const
1998-04-14 00:24:54 +04:00
{
return mBuffer;
}
NS_IMETHODIMP_(bool)
UnicharBufferImpl::Grow(int32_t aNewSize)
1998-04-14 00:24:54 +04:00
{
if (uint32_t(aNewSize) < MIN_BUFFER_SIZE) {
1998-04-14 00:24:54 +04:00
aNewSize = MIN_BUFFER_SIZE;
}
PRUnichar* newbuf = new PRUnichar[aNewSize];
if (nullptr != newbuf) {
1998-04-14 00:24:54 +04:00
if (0 != mLength) {
memcpy(newbuf, mBuffer, mLength * sizeof(PRUnichar));
1998-04-14 00:24:54 +04:00
}
delete[] mBuffer;
1998-04-14 00:24:54 +04:00
mBuffer = newbuf;
return true;
1998-04-14 00:24:54 +04:00
}
return false;
1998-04-14 00:24:54 +04:00
}
nsresult
1999-05-26 05:38:36 +04:00
NS_NewUnicharBuffer(nsIUnicharBuffer** aInstancePtrResult,
nsISupports* aOuter,
uint32_t aBufferSize)
1998-04-14 00:24:54 +04:00
{
1999-05-26 05:38:36 +04:00
nsresult rv;
nsIUnicharBuffer* buf;
rv = UnicharBufferImpl::Create(aOuter, NS_GET_IID(nsIUnicharBuffer),
1999-05-26 05:38:36 +04:00
(void**)&buf);
if (NS_FAILED(rv)) return rv;
rv = buf->Init(aBufferSize);
if (NS_FAILED(rv)) {
NS_RELEASE(buf);
return rv;
1998-04-14 00:24:54 +04:00
}
1999-05-26 05:38:36 +04:00
*aInstancePtrResult = buf;
return rv;
1998-04-14 00:24:54 +04:00
}