Add proper initializers and remove manual memory management from common classes

master
Piotr Dziwinski 2015-08-10 20:43:00 +02:00
parent abb272600e
commit 513a1129fa
7 changed files with 54 additions and 33 deletions

View File

@ -23,6 +23,7 @@
#include "app/system.h"
#include "common/logger.h"
#include "common/make_unique.h"
#include "common/resources/inputstream.h"
#include "common/resources/outputstream.h"
@ -68,15 +69,15 @@ bool CConfigFile::Init()
bool good;
if (m_useCurrentDirectory)
{
std::ifstream* inputStream = new std::ifstream("./colobot.ini");
stream = std::unique_ptr<std::istream>(inputStream);
auto inputStream = MakeUnique<std::ifstream>("./colobot.ini");
good = inputStream->good();
stream = std::move(inputStream);
}
else
{
CInputStream* inputStream = new CInputStream("colobot.ini");
stream = std::unique_ptr<std::istream>(inputStream);
auto inputStream = MakeUnique<CInputStream>("colobot.ini");
good = inputStream->is_open();
stream = std::move(inputStream);
}
if (good)
@ -108,15 +109,15 @@ bool CConfigFile::Save()
bool good;
if (m_useCurrentDirectory)
{
std::ofstream* outputStream = new std::ofstream("./colobot.ini");
stream = std::unique_ptr<std::ostream>(outputStream);
auto outputStream = MakeUnique<std::ofstream>("./colobot.ini");
good = outputStream->good();
stream = std::move(outputStream);
}
else
{
COutputStream* outputStream = new COutputStream("colobot.ini");
stream = std::unique_ptr<std::ostream>(outputStream);
auto outputStream = MakeUnique<COutputStream>("colobot.ini");
good = outputStream->is_open();
stream = std::move(outputStream);
}
if (good)

View File

@ -22,6 +22,7 @@
#include <cstddef>
#include <memory>
/**
* A template function to make std::unique_ptr without naked new
* It can be replaced with std::make_unique once we use C++14
@ -29,7 +30,9 @@
template<typename T, typename... Args>
inline std::unique_ptr<T> MakeUnique(Args&&... args)
{
//@colobot-lint-exclude NakedNewRule
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
//@end-colobot-lint-exclude
}
/**
@ -39,5 +42,7 @@ inline std::unique_ptr<T> MakeUnique(Args&&... args)
template<typename T>
inline std::unique_ptr<T[]> MakeUniqueArray(std::size_t size)
{
//@colobot-lint-exclude NakedNewRule
return std::unique_ptr<T[]>(new T[size]);
//@end-colobot-lint-exclude
}

View File

@ -22,41 +22,39 @@
#include "common/resources/inputstreambuffer.h"
CInputStream::CInputStream() : std::istream(new CInputStreamBuffer())
CInputStream::CInputStream()
: CInputStreamBufferContainer(),
std::istream(&m_buffer)
{
}
CInputStream::CInputStream(const std::string& filename) : std::istream(new CInputStreamBuffer())
CInputStream::CInputStream(const std::string& filename)
: CInputStreamBufferContainer(),
std::istream(&m_buffer)
{
open(filename);
}
CInputStream::~CInputStream()
{
delete rdbuf();
}
void CInputStream::open(const std::string& filename)
{
static_cast<CInputStreamBuffer *>(rdbuf())->open(filename);
m_buffer.open(filename);
}
void CInputStream::close()
{
static_cast<CInputStreamBuffer *>(rdbuf())->close();
m_buffer.close();
}
bool CInputStream::is_open()
{
return static_cast<CInputStreamBuffer *>(rdbuf())->is_open();
return m_buffer.is_open();
}
std::size_t CInputStream::size()
{
return static_cast<CInputStreamBuffer *>(rdbuf())->size();
return m_buffer.size();
}

View File

@ -19,12 +19,21 @@
#pragma once
#include "common/resources/inputstreambuffer.h"
#include <cstddef>
#include <istream>
#include <string>
class CInputStream : public std::istream
class CInputStreamBufferContainer
{
protected:
CInputStreamBuffer m_buffer;
};
class CInputStream : public CInputStreamBufferContainer, public std::istream
{
public:
CInputStream();

View File

@ -22,35 +22,34 @@
#include "common/resources/outputstreambuffer.h"
COutputStream::COutputStream() : std::ostream(new COutputStreamBuffer())
COutputStream::COutputStream()
: COutputStreamBufferContainer(),
std::ostream(&m_buffer)
{
}
COutputStream::COutputStream(const std::string& filename) : std::ostream(new COutputStreamBuffer())
COutputStream::COutputStream(const std::string& filename)
: COutputStreamBufferContainer(),
std::ostream(&m_buffer)
{
open(filename);
}
COutputStream::~COutputStream()
{
delete rdbuf();
}
void COutputStream::open(const std::string& filename)
{
static_cast<COutputStreamBuffer *>(rdbuf())->open(filename);
m_buffer.open(filename);
}
void COutputStream::close()
{
static_cast<COutputStreamBuffer *>(rdbuf())->close();
m_buffer.close();
}
bool COutputStream::is_open()
{
return static_cast<COutputStreamBuffer *>(rdbuf())->is_open();
return m_buffer.is_open();
}

View File

@ -19,11 +19,19 @@
#pragma once
#include "common/resources/outputstreambuffer.h"
#include <ostream>
#include <string>
class COutputStream : public std::ostream
class COutputStreamBufferContainer
{
protected:
COutputStreamBuffer m_buffer;
};
class COutputStream : public COutputStreamBufferContainer, public std::ostream
{
public:
COutputStream();

View File

@ -33,7 +33,8 @@ public:
using ThreadFunctionPtr = std::function<void()>;
CSDLThreadWrapper(ThreadFunctionPtr threadFunction)
: m_threadFunction(threadFunction)
: m_threadFunction(threadFunction),
m_thread(nullptr)
{}
~CSDLThreadWrapper()