[DEV] test unique ptr
This commit is contained in:
parent
ee9a5de786
commit
24f752f79b
@ -1,21 +1,22 @@
|
|||||||
#ifndef UniquePtr_HPP_INCLUDED
|
|
||||||
#define UniquePtr_HPP_INCLUDED
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <etk/types.hpp>
|
||||||
namespace ememory {
|
namespace ememory {
|
||||||
template <class EMEM_UPTR_TYPE>
|
template <class EMEM_UPTR_TYPE>
|
||||||
class UniquePtr {
|
class UniquePtr {
|
||||||
private:
|
private:
|
||||||
EMEM_UPTR_TYPE* m_pointer;
|
EMEM_UPTR_TYPE* m_pointer;
|
||||||
template <class EMEM_UPTR_TYPE> UniquePtr(UniquePtr<EMEM_UPTR_TYPE> &);
|
|
||||||
template <class EMEM_UPTR_TYPE> UniquePtr &operator=(UniquePtr<EMEM_UPTR_TYPE> &);
|
template <class EMEM_UPTR_TYPE_2>
|
||||||
|
UniquePtr(UniquePtr<EMEM_UPTR_TYPE_2> &) = delete;
|
||||||
|
|
||||||
|
template <class EMEM_UPTR_TYPE_2>
|
||||||
|
UniquePtr &operator=(UniquePtr<EMEM_UPTR_TYPE_2> &) = delete;
|
||||||
public:
|
public:
|
||||||
UniquePtr() :
|
UniquePtr() :
|
||||||
m_pointer(nullptr) {
|
m_pointer(nullptr) {
|
||||||
|
|
||||||
}
|
|
||||||
UniquePtr(nullptr) :
|
|
||||||
m_pointer(nullptr) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
explicit UniquePtr(EMEM_UPTR_TYPE* _obj) :
|
explicit UniquePtr(EMEM_UPTR_TYPE* _obj) :
|
||||||
m_pointer(_obj)
|
m_pointer(_obj)
|
||||||
@ -30,9 +31,9 @@ namespace ememory {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
template <class EMEM_UPTR_TYPE_2>
|
template <class EMEM_UPTR_TYPE_2>
|
||||||
UniquePtr& operator=(UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER> _obj){
|
UniquePtr& operator=(UniquePtr<EMEM_UPTR_TYPE_2> _obj){
|
||||||
reset(_obj.release());
|
reset(_obj.release());
|
||||||
m_pointer = etk::move(_obj.pointer)
|
m_pointer = etk::move(_obj.pointer);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
EMEM_UPTR_TYPE operator*() const{
|
EMEM_UPTR_TYPE operator*() const{
|
||||||
@ -42,10 +43,10 @@ namespace ememory {
|
|||||||
return m_pointer;
|
return m_pointer;
|
||||||
}
|
}
|
||||||
EMEM_UPTR_TYPE *get() const{
|
EMEM_UPTR_TYPE *get() const{
|
||||||
return *m_pointer;
|
return m_pointer;
|
||||||
}
|
}
|
||||||
EMEM_UPTR_TYPE *release(){
|
EMEM_UPTR_TYPE *release(){
|
||||||
T *tmp = m_pointer;
|
EMEM_UPTR_TYPE *tmp = m_pointer;
|
||||||
m_pointer = 0;
|
m_pointer = 0;
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
@ -58,7 +59,7 @@ namespace ememory {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class EMEM_UPTR_TYPE>
|
template<class EMEM_UPTR_TYPE, class... EMEM_UPTR_ARG>
|
||||||
UniquePtr<EMEM_UPTR_TYPE> makeUniquePtr(EMEM_UPTR_ARG ... _obj) {
|
UniquePtr<EMEM_UPTR_TYPE> makeUniquePtr(EMEM_UPTR_ARG ... _obj) {
|
||||||
return ememory::UniquePtr<EMEM_UPTR_TYPE>(new EMEM_UPTR_TYPE(_obj...));
|
return ememory::UniquePtr<EMEM_UPTR_TYPE>(new EMEM_UPTR_TYPE(_obj...));
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <ememory/UniquePtr.hpp>
|
||||||
|
#include <test-debug/debug.hpp>
|
||||||
|
#define NAME "UNIQUE-PTR"
|
||||||
|
|
||||||
|
TEST(TestEmemoryUniquePtr, Creation_1) {
|
||||||
|
ememory::UniquePtr<uint32_t> testData;
|
||||||
|
EXPECT_EQ(testData.get(), nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(TestEmemoryUniquePtr, Creation_2) {
|
||||||
|
ememory::UniquePtr<uint32_t> testData(new uint32_t(55));
|
||||||
|
EXPECT_NE(testData.get(), nullptr);
|
||||||
|
EXPECT_EQ(*testData.get(), 55);
|
||||||
|
}
|
||||||
|
TEST(TestEmemoryUniquePtr, Creation_3) {
|
||||||
|
ememory::UniquePtr<uint32_t> testData = ememory::makeUniquePtr<uint32_t>(456789);
|
||||||
|
EXPECT_NE(testData.get(), nullptr);
|
||||||
|
EXPECT_EQ(*testData.get(), 456789);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t vals[] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
|
class testCreateAndDestroy {
|
||||||
|
public:
|
||||||
|
uint32_t m_val;
|
||||||
|
public:
|
||||||
|
testCreateAndDestroy(uint32_t _val):
|
||||||
|
m_val(_val) {
|
||||||
|
vals[m_val] = 1;
|
||||||
|
}
|
||||||
|
~testCreateAndDestroy() {
|
||||||
|
vals[m_val] = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(TestEmemoryUniquePtr, reset) {
|
||||||
|
vals = {0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
EXPECT_EQ(vals[1], 0);
|
||||||
|
ememory::UniquePtr<testCreateAndDestroy> testData = ememory::makeUniquePtr<testCreateAndDestroy>(1);
|
||||||
|
EXPECT_NE(testData.get(), nullptr);
|
||||||
|
EXPECT_EQ(vals[1], 1);
|
||||||
|
testData.reset();
|
||||||
|
EXPECT_EQ(testData.get(), nullptr);
|
||||||
|
EXPECT_EQ(vals[1], -1);
|
||||||
|
}
|
||||||
|
TEST(TestEmemoryUniquePtr, overwrite) {
|
||||||
|
vals = {0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
ememory::UniquePtr<testCreateAndDestroy> testData = ememory::makeUniquePtr<testCreateAndDestroy>(1);
|
||||||
|
EXPECT_NE(testData.get(), nullptr);
|
||||||
|
EXPECT_EQ(vals[1], 1);
|
||||||
|
EXPECT_EQ(vals[2], 0);
|
||||||
|
testData = ememory::makeUniquePtr<testCreateAndDestroy>(2);
|
||||||
|
EXPECT_EQ(vals[1], -1);
|
||||||
|
EXPECT_EQ(vals[2], 1);
|
||||||
|
testData.reset();
|
||||||
|
EXPECT_EQ(vals[1], -1);
|
||||||
|
EXPECT_EQ(vals[2], -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user