mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2026-05-15 19:57:53 +00:00
218 lines
4.2 KiB
C++
218 lines
4.2 KiB
C++
// Copyright (C) 2007 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_SCOPED_PTr_
|
|
#define DLIB_SCOPED_PTr_
|
|
|
|
#include <algorithm>
|
|
#include "../noncopyable.h"
|
|
#include "../algs.h"
|
|
#include "scoped_ptr_abstract.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
struct default_deleter
|
|
{
|
|
void operator() (T* item) const
|
|
{
|
|
delete item;
|
|
}
|
|
};
|
|
|
|
template <typename T>
|
|
struct default_deleter<T[]>
|
|
{
|
|
void operator() (T* item) const
|
|
{
|
|
delete [] item;
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename deleter = default_deleter<T>
|
|
>
|
|
class scoped_ptr : noncopyable
|
|
{
|
|
/*!
|
|
CONVENTION
|
|
- get() == ptr
|
|
!*/
|
|
|
|
public:
|
|
typedef T element_type;
|
|
typedef deleter deleter_type;
|
|
|
|
explicit scoped_ptr (
|
|
T* p = 0
|
|
) : ptr(p) { }
|
|
|
|
~scoped_ptr()
|
|
{
|
|
if (ptr)
|
|
{
|
|
deleter del;
|
|
del(ptr);
|
|
}
|
|
}
|
|
|
|
void reset (
|
|
T* p = 0
|
|
)
|
|
{
|
|
if (ptr)
|
|
{
|
|
deleter del;
|
|
del(ptr);
|
|
}
|
|
|
|
ptr = p;
|
|
}
|
|
|
|
T& operator*() const
|
|
{
|
|
DLIB_ASSERT(get() != 0,
|
|
"\tscoped_ptr::operator*()"
|
|
<< "\n\tget() can't be null if you are going to dereference it"
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
return *ptr;
|
|
}
|
|
|
|
T* operator->() const
|
|
{
|
|
DLIB_ASSERT(get() != 0,
|
|
"\tscoped_ptr::operator*()"
|
|
<< "\n\tget() can't be null"
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
return ptr;
|
|
}
|
|
|
|
T* get() const
|
|
{
|
|
return ptr;
|
|
}
|
|
|
|
operator bool() const
|
|
{
|
|
return (ptr != 0);
|
|
}
|
|
|
|
void swap(
|
|
scoped_ptr& b
|
|
)
|
|
{
|
|
std::swap(ptr,b.ptr);
|
|
}
|
|
|
|
private:
|
|
|
|
T* ptr;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename deleter
|
|
>
|
|
class scoped_ptr<T[],deleter> : noncopyable
|
|
{
|
|
/*!
|
|
CONVENTION
|
|
- get() == ptr
|
|
!*/
|
|
|
|
public:
|
|
typedef T element_type;
|
|
|
|
explicit scoped_ptr (
|
|
T* p = 0
|
|
) : ptr(p) { }
|
|
|
|
~scoped_ptr()
|
|
{
|
|
if (ptr)
|
|
{
|
|
deleter del;
|
|
del(ptr);
|
|
}
|
|
}
|
|
|
|
void reset (
|
|
T* p = 0
|
|
)
|
|
{
|
|
if (ptr)
|
|
{
|
|
deleter del;
|
|
del(ptr);
|
|
}
|
|
ptr = p;
|
|
}
|
|
|
|
T& operator[] (
|
|
unsigned long idx
|
|
) const
|
|
{
|
|
DLIB_ASSERT(get() != 0,
|
|
"\tscoped_ptr::operator[]()"
|
|
<< "\n\tget() can't be null if you are going to dereference it"
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
return ptr[idx];
|
|
}
|
|
|
|
T* get() const
|
|
{
|
|
return ptr;
|
|
}
|
|
|
|
operator bool() const
|
|
{
|
|
return (ptr != 0);
|
|
}
|
|
|
|
void swap(
|
|
scoped_ptr& b
|
|
)
|
|
{
|
|
std::swap(ptr,b.ptr);
|
|
}
|
|
|
|
private:
|
|
|
|
T* ptr;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename deleter
|
|
>
|
|
void swap(
|
|
scoped_ptr<T,deleter>& a,
|
|
scoped_ptr<T,deleter>& b
|
|
)
|
|
{
|
|
a.swap(b);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_SCOPED_PTr_
|
|
|
|
|