blob: e8d21c7179615d5f3f9aa17080b3bef76eca1f41 [file] [log] [blame]
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
#ifndef __WEBMDSHOW_COMMON_MEMUTIL_HPP__
#define __WEBMDSHOW_COMMON_MEMUTIL_HPP__
#pragma once
#include "chromium/base/basictypes.h"
namespace WebmUtil
{
template <typename BufferType>
class auto_array
{
public:
auto_array(BufferType* ptr_buf, size_t count) :
buffer_(ptr_buf),
num_elements_(count)
{
};
~auto_array()
{
if (buffer_)
{
delete[] buffer_;
buffer_ = NULL;
}
num_elements_ = 0;
};
BufferType* get() const
{
return buffer_;
};
BufferType* operator->() const
{
return get();
};
BufferType& operator*() const
{
return *get();
};
operator bool() const
{
return buffer_ != NULL;
};
operator BufferType*() const
{
return get();
};
size_t size() const
{
return num_elements_;
};
void reset(BufferType* ptr_buf, size_t count)
{
if (buffer_)
{
delete[] buffer_;
buffer_ = (BufferType)0;
}
num_elements_ = count;
buffer_ = ptr_buf;
};
private:
BufferType* buffer_;
size_t num_elements_;
DISALLOW_COPY_AND_ASSIGN(auto_array);
};
// |auto_ref_counted_obj_ptr|, an auto_ptr like class for managing ref counted
// object pointers.
template <typename RefCountedObject>
class auto_ref_counted_obj_ptr // this name seems a crime against humanity...
{
public:
auto_ref_counted_obj_ptr(RefCountedObject* ptr_obj) :
ptr_obj_(ptr_obj)
{
};
~auto_ref_counted_obj_ptr()
{
safe_rel(ptr_obj_);
};
// allow user to take ownership of encapsulated pointer
RefCountedObject* detach()
{
RefCountedObject* ptr_obj = ptr_obj_;
ptr_obj_ = NULL;
return ptr_obj;
};
RefCountedObject* get() const
{
return ptr_obj_;
};
// allow user to check pointer via 'if (ptr) ...'
operator bool() const
{
return ptr_obj_ != NULL;
};
// allow pass by value of encapsulated pointer
operator RefCountedObject* const()
{
return get();
};
// allow manipulation of object
RefCountedObject* operator->() const
{
return get();
};
RefCountedObject& operator*() const
{
return *get();
};
// allow user to pass us directly to ref counted object creation functions
RefCountedObject** operator&()
{
safe_rel(ptr_obj_);
return &ptr_obj_;
};
// release old and assign new obj ptr
void reset(RefCountedObject* ptr_obj)
{
safe_rel(ptr_obj_);
ptr_obj_ = ptr_obj;
};
private:
RefCountedObject* ptr_obj_;
DISALLOW_COPY_AND_ASSIGN(auto_ref_counted_obj_ptr);
};
template <typename COMOBJ>
ULONG safe_rel(COMOBJ*& comobj)
{
ULONG refcnt = 0;
if (comobj)
{
refcnt = comobj->Release();
comobj = NULL;
}
return refcnt;
}
} // WebmUtil namespace
#endif // __WEBMDSHOW_COMMON_MEMUTIL_HPP__