From: <man...@us...> - 2014-10-21 10:59:02
|
Revision: 4455 http://sourceforge.net/p/modplug/code/4455 Author: manxorist Date: 2014-10-21 10:58:54 +0000 (Tue, 21 Oct 2014) Log Message: ----------- [Ref] To order to make the code look more C++11-ish, add mpt::make_shared<T> that mimics C++11 std::make_shared<T>. mpt::make_shared sacrifices perfect forwarding and does not make use of variadic templates in order to keep things simple and compatible. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.cpp trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/soundlib/FileReader.h trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/misc_util.cpp =================================================================== --- trunk/OpenMPT/common/misc_util.cpp 2014-10-20 14:38:52 UTC (rev 4454) +++ trunk/OpenMPT/common/misc_util.cpp 2014-10-21 10:58:54 UTC (rev 4455) @@ -1040,7 +1040,7 @@ Library::Library(const mpt::LibraryPath &path) //-------------------------------------------- { - m_Handle = MPT_SHARED_PTR<LibraryHandle>(new LibraryHandle(path)); + m_Handle = mpt::make_shared<LibraryHandle>(path); } Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2014-10-20 14:38:52 UTC (rev 4454) +++ trunk/OpenMPT/common/typedefs.h 2014-10-21 10:58:54 UTC (rev 4455) @@ -179,13 +179,35 @@ +// For mpt::make_shared<T>, we sacrifice perfect forwarding in order to keep things simple here. +// Templated for up to 4 parameters. Add more when required. + OPENMPT_NAMESPACE_END #include <memory> OPENMPT_NAMESPACE_BEGIN + #if MPT_COMPILER_MSVC && MPT_MSVC_BEFORE(2010,0) + #define MPT_SHARED_PTR std::tr1::shared_ptr +namespace mpt { +template <typename T> inline MPT_SHARED_PTR<T> make_shared() { return MPT_SHARED_PTR<T>(new T()); } +template <typename T, typename T1> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1) { return MPT_SHARED_PTR<T>(new T(x1)); } +template <typename T, typename T1, typename T2> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2) { return MPT_SHARED_PTR<T>(new T(x1, x2)); } +template <typename T, typename T1, typename T2, typename T3> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2, const T3 &x3) { return MPT_SHARED_PTR<T>(new T(x1, x2, x3)); } +template <typename T, typename T1, typename T2, typename T3, typename T4> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2, const T3 &x3, const T4 &x4) { return MPT_SHARED_PTR<T>(new T(x1, x2, x3, x4)); } +} // namespace mpt + #else + #define MPT_SHARED_PTR std::shared_ptr +namespace mpt { +template <typename T> inline MPT_SHARED_PTR<T> make_shared() { return std::make_shared<T>(); } +template <typename T, typename T1> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1) { return std::make_shared<T>(x1); } +template <typename T, typename T1, typename T2> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2) { return std::make_shared<T>(x1, x2); } +template <typename T, typename T1, typename T2, typename T3> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2, const T3 &x3) { return std::make_shared<T>(x1, x2, x3); } +template <typename T, typename T1, typename T2, typename T3, typename T4> inline MPT_SHARED_PTR<T> make_shared(const T1 &x1, const T2 &x2, const T3 &x3, const T4 &x4) { return std::make_shared<T>(x1, x2, x3, x4); } +} // namespace mpt + #endif Modified: trunk/OpenMPT/soundlib/FileReader.h =================================================================== --- trunk/OpenMPT/soundlib/FileReader.h 2014-10-20 14:38:52 UTC (rev 4454) +++ trunk/OpenMPT/soundlib/FileReader.h 2014-10-21 10:58:54 UTC (rev 4455) @@ -69,22 +69,22 @@ #if defined(MPT_FILEREADER_STD_ISTREAM) // Initialize invalid file reader object. - FileReader() : data(new FileDataContainerDummy()), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } + FileReader() : data(mpt::make_shared<FileDataContainerDummy>()), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } // Initialize file reader object with pointer to data and data length. - FileReader(const void *voiddata, off_t length) : data(new FileDataContainerMemory(static_cast<const char *>(voiddata), length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } - FileReader(const char *chardata, off_t length) : data(new FileDataContainerMemory(chardata, length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } - FileReader(const uint8 *uint8data, off_t length) : data(new FileDataContainerMemory(reinterpret_cast<const char *>(uint8data), length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } + FileReader(const void *voiddata, off_t length) : data(mpt::make_shared<FileDataContainerMemory>(static_cast<const char *>(voiddata), length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } + FileReader(const char *chardata, off_t length) : data(mpt::make_shared<FileDataContainerMemory>(chardata, length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } + FileReader(const uint8 *uint8data, off_t length) : data(mpt::make_shared<FileDataContainerMemory>(reinterpret_cast<const char *>(uint8data), length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } #if defined(MODPLUG_TRACKER) - FileReader(const void *voiddata, off_t length, mpt::PathString *filename) : data(new FileDataContainerMemory(static_cast<const char *>(voiddata), length)), streamPos(0), fileName(filename) { } - FileReader(const char *chardata, off_t length, mpt::PathString *filename) : data(new FileDataContainerMemory(chardata, length)), streamPos(0), fileName(filename) { } - FileReader(const uint8 *uint8data, off_t length, mpt::PathString *filename) : data(new FileDataContainerMemory(reinterpret_cast<const char *>(uint8data), length)), streamPos(0), fileName(filename) { } + FileReader(const void *voiddata, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(static_cast<const char *>(voiddata), length)), streamPos(0), fileName(filename) { } + FileReader(const char *chardata, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(chardata, length)), streamPos(0), fileName(filename) { } + FileReader(const uint8 *uint8data, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(reinterpret_cast<const char *>(uint8data), length)), streamPos(0), fileName(filename) { } #endif // Initialize file reader object with a std::istream. - FileReader(std::istream *s) : data(new FileDataContainerStdStream(s)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } + FileReader(std::istream *s) : data(mpt::make_shared<FileDataContainerStdStream>(s)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } #if defined(MODPLUG_TRACKER) - FileReader(std::istream *s, mpt::PathString *filename) : data(new FileDataContainerStdStream(s)), streamPos(0), fileName(filename) { } + FileReader(std::istream *s, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerStdStream>(s)), streamPos(0), fileName(filename) { } #endif // Initialize file reader object based on an existing file reader object window. @@ -240,7 +240,7 @@ return FileReader(); } #if defined(MPT_FILEREADER_STD_ISTREAM) - return FileReader(MPT_SHARED_PTR<IFileDataContainer>(new FileDataContainerWindow(data, position, std::min(length, DataContainer().GetLength() - position)))); + return FileReader(mpt::make_shared<FileDataContainerWindow>(data, position, std::min(length, DataContainer().GetLength() - position))); #else return FileReader(DataContainer().GetRawData() + position, std::min(length, DataContainer().GetLength() - position)); #endif Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2014-10-20 14:38:52 UTC (rev 4454) +++ trunk/OpenMPT/test/test.cpp 2014-10-21 10:58:54 UTC (rev 4455) @@ -1943,7 +1943,7 @@ //-------------------------------------------- { FileReader file; - MPT_SHARED_PTR<CSoundFile> pSndFile(new CSoundFile()); + MPT_SHARED_PTR<CSoundFile> pSndFile = mpt::make_shared<CSoundFile>(); CSoundFile &sndFile = *pSndFile.get(); sndFile.ChangeModTypeTo(MOD_TYPE_MPT); sndFile.Patterns.DestroyPatterns(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |