1052 lines
36 KiB
Diff
1052 lines
36 KiB
Diff
Index: lib/CGeneralTextHandler.h
|
|
===================================================================
|
|
--- lib/CGeneralTextHandler.h (revision 3494)
|
|
+++ lib/CGeneralTextHandler.h (working copy)
|
|
@@ -15,7 +15,7 @@
|
|
/// Parser for any text files from H3
|
|
class CLegacyConfigParser
|
|
{
|
|
- std::unique_ptr<char[]> data;
|
|
+ std::vector<char> data;
|
|
char * curr;
|
|
char * end;
|
|
|
|
Index: lib/IGameCallback.cpp
|
|
===================================================================
|
|
--- lib/IGameCallback.cpp (revision 3494)
|
|
+++ lib/IGameCallback.cpp (working copy)
|
|
@@ -661,7 +661,7 @@
|
|
|
|
const CMapHeader * CGameInfoCallback::getMapHeader() const
|
|
{
|
|
- return gs->map;
|
|
+ return gs->map.get();
|
|
}
|
|
|
|
bool CGameInfoCallback::hasAccess(boost::optional<PlayerColor> playerId) const
|
|
Index: lib/Connection.cpp
|
|
===================================================================
|
|
--- lib/Connection.cpp (revision 3494)
|
|
+++ lib/Connection.cpp (working copy)
|
|
@@ -526,10 +526,10 @@
|
|
return ret;
|
|
}
|
|
|
|
-unique_ptr<CLoadFile> CLoadIntegrityValidator::decay()
|
|
+std::unique_ptr<CLoadFile> CLoadIntegrityValidator::decay()
|
|
{
|
|
primaryFile->loadedPointers = this->loadedPointers;
|
|
- return std::move(primaryFile);
|
|
+ return /*std::move*/(primaryFile);
|
|
}
|
|
|
|
void CLoadIntegrityValidator::checkMagicBytes( const std::string &text )
|
|
Index: lib/CDefObjInfoHandler.cpp
|
|
===================================================================
|
|
--- lib/CDefObjInfoHandler.cpp (revision 3494)
|
|
+++ lib/CDefObjInfoHandler.cpp (working copy)
|
|
@@ -37,12 +37,12 @@
|
|
|
|
auto msk = CResourceHandler::get()->load(ResourceID(std::string("SPRITES/") + name, EResType::MASK))->readAll();
|
|
|
|
- width = msk.first.get()[0];
|
|
- height = msk.first.get()[1];
|
|
+ width = msk[0];
|
|
+ height = msk[1];
|
|
for(int i=0; i<6; ++i)
|
|
{
|
|
- coverageMap[i] = msk.first.get()[i+2];
|
|
- shadowCoverage[i] = msk.first.get()[i+8];
|
|
+ coverageMap[i] = msk[i+2];
|
|
+ shadowCoverage[i] = msk[i+8];
|
|
}
|
|
}
|
|
|
|
@@ -51,7 +51,7 @@
|
|
VLC->dobjinfo = this;
|
|
|
|
auto textFile = CResourceHandler::get()->load(ResourceID("DATA/OBJECTS.TXT"))->readAll();
|
|
- std::istringstream inp(std::string((char*)textFile.first.get(), textFile.second));
|
|
+ std::istringstream inp(std::string((char*)textFile.data(), textFile.size()));
|
|
int objNumber;
|
|
inp>>objNumber;
|
|
std::string mapStr;
|
|
Index: lib/JsonNode.cpp
|
|
===================================================================
|
|
--- lib/JsonNode.cpp (revision 3494)
|
|
+++ lib/JsonNode.cpp (working copy)
|
|
@@ -43,7 +43,7 @@
|
|
{
|
|
auto file = CResourceHandler::get()->load(fileURI)->readAll();
|
|
|
|
- JsonParser parser(reinterpret_cast<char*>(file.first.get()), file.second);
|
|
+ JsonParser parser((const char *)file.data(), file.size());
|
|
*this = parser.parse(fileURI.getName());
|
|
}
|
|
|
|
@@ -1574,7 +1574,7 @@
|
|
//reserve place and *move* remaining data from source to dest
|
|
source.Vector().reserve(source.Vector().size() + dest.Vector().size());
|
|
|
|
- std::move(source.Vector().begin() + total, source.Vector().end(),
|
|
+ std::copy(source.Vector().begin() + total, source.Vector().end(),
|
|
std::back_inserter(dest.Vector()));
|
|
}
|
|
break;
|
|
@@ -1615,10 +1615,10 @@
|
|
{
|
|
// FIXME: some way to make this code more readable
|
|
auto stream = loader->load(resID);
|
|
- std::unique_ptr<ui8[]> textData(new ui8[stream->getSize()]);
|
|
- stream->read(textData.get(), stream->getSize());
|
|
+ std::vector<ui8> textData(stream->getSize());
|
|
+ stream->read(textData.data(), stream->getSize());
|
|
|
|
- JsonNode section((char*)textData.get(), stream->getSize());
|
|
+ JsonNode section((char*)textData.data(), stream->getSize());
|
|
merge(result, section);
|
|
}
|
|
return result;
|
|
Index: lib/CGameState.h
|
|
===================================================================
|
|
--- lib/CGameState.h (revision 3494)
|
|
+++ lib/CGameState.h (working copy)
|
|
@@ -363,7 +363,7 @@
|
|
PlayerColor currentPlayer; //ID of player currently having turn
|
|
ConstTransitivePtr<BattleInfo> curB; //current battle
|
|
ui32 day; //total number of days in game
|
|
- ConstTransitivePtr<CMap> map;
|
|
+ shared_ptr<CMap> map;
|
|
bmap<PlayerColor, PlayerState> players;
|
|
bmap<TeamID, TeamState> teams;
|
|
CBonusSystemNode globalEffects;
|
|
Index: lib/mapping/CMapInfo.cpp
|
|
===================================================================
|
|
--- lib/mapping/CMapInfo.cpp (revision 3494)
|
|
+++ lib/mapping/CMapInfo.cpp (working copy)
|
|
@@ -35,9 +35,9 @@
|
|
|
|
}
|
|
|
|
-#define STEAL(x) x = std::move(tmp.x)
|
|
+#define STEAL(x) x = /*std::move*/(tmp.x)
|
|
|
|
-CMapInfo::CMapInfo(CMapInfo && tmp)
|
|
+CMapInfo::CMapInfo(const CMapInfo & tmp)
|
|
{
|
|
STEAL(mapHeader);
|
|
STEAL(campaignHeader);
|
|
@@ -54,16 +54,16 @@
|
|
void CMapInfo::mapInit(const std::string & fname)
|
|
{
|
|
fileURI = fname;
|
|
- mapHeader = CMapService::loadMapHeader(fname);
|
|
+ mapHeader = std::make_shared<CMapHeader>(*CMapService::loadMapHeader(fname));
|
|
countPlayers();
|
|
}
|
|
|
|
void CMapInfo::campaignInit()
|
|
{
|
|
- campaignHeader = std::unique_ptr<CCampaignHeader>(new CCampaignHeader(CCampaignHandler::getHeader(fileURI)));
|
|
+ campaignHeader = std::make_shared<CCampaignHeader>(CCampaignHandler::getHeader(fileURI));
|
|
}
|
|
|
|
-CMapInfo & CMapInfo::operator=(CMapInfo &&tmp)
|
|
+CMapInfo & CMapInfo::operator=(const CMapInfo &tmp)
|
|
{
|
|
STEAL(mapHeader);
|
|
STEAL(campaignHeader);
|
|
Index: lib/mapping/MapFormatH3M.cpp
|
|
===================================================================
|
|
--- lib/mapping/MapFormatH3M.cpp (revision 3494)
|
|
+++ lib/mapping/MapFormatH3M.cpp (working copy)
|
|
@@ -44,7 +44,7 @@
|
|
mapHeader = std::unique_ptr<CMapHeader>(dynamic_cast<CMapHeader *>(map));
|
|
init();
|
|
|
|
- return std::unique_ptr<CMap>(dynamic_cast<CMap *>(mapHeader.release()));;
|
|
+ return std::unique_ptr<CMap>(dynamic_cast<CMap *>(mapHeader.get()));
|
|
}
|
|
|
|
std::unique_ptr<CMapHeader> CMapLoaderH3M::loadMapHeader()
|
|
Index: lib/mapping/CMapInfo.h
|
|
===================================================================
|
|
--- lib/mapping/CMapInfo.h (revision 3494)
|
|
+++ lib/mapping/CMapInfo.h (working copy)
|
|
@@ -20,8 +20,8 @@
|
|
class DLL_LINKAGE CMapInfo
|
|
{
|
|
public:
|
|
- unique_ptr<CMapHeader> mapHeader; //may be nullptr if campaign
|
|
- unique_ptr<CCampaignHeader> campaignHeader; //may be nullptr if scenario
|
|
+ shared_ptr<CMapHeader> mapHeader; //may be nullptr if campaign
|
|
+ shared_ptr<CCampaignHeader> campaignHeader; //may be nullptr if scenario
|
|
StartInfo * scenarioOpts; //options with which scenario has been started (used only with saved games)
|
|
std::string fileURI;
|
|
std::string date;
|
|
@@ -31,9 +31,9 @@
|
|
bool isRandomMap; // true if the map will be created randomly, false if not
|
|
|
|
CMapInfo();
|
|
- CMapInfo(CMapInfo && tmp);
|
|
+ CMapInfo(const CMapInfo & tmp);
|
|
|
|
- CMapInfo &operator=(CMapInfo &&other);
|
|
+ CMapInfo &operator=(const CMapInfo &other);
|
|
|
|
void mapInit(const std::string & fname);
|
|
void campaignInit();
|
|
Index: lib/CGameState.cpp
|
|
===================================================================
|
|
--- lib/CGameState.cpp (revision 3494)
|
|
+++ lib/CGameState.cpp (working copy)
|
|
@@ -757,7 +757,7 @@
|
|
CGameState::~CGameState()
|
|
{
|
|
//delete mx;//TODO: crash on Linux (mutex must be unlocked before destruction)
|
|
- map.dellNull();
|
|
+ map.reset();
|
|
curB.dellNull();
|
|
//delete scenarioOps; //TODO: fix for loading ind delete
|
|
//delete initialOpts;
|
|
@@ -868,7 +868,7 @@
|
|
|
|
// Gen map
|
|
CMapGenerator mapGen(*(scenarioOps->mapGenOptions), scenarioOps->seedToBeUsed);
|
|
- map = mapGen.generate().release();
|
|
+ map = mapGen.generate();
|
|
|
|
// Update starting options
|
|
for(int i = 0; i < map->players.size(); ++i)
|
|
@@ -897,7 +897,7 @@
|
|
else
|
|
{
|
|
logGlobal->infoStream() << "Open map file: " << scenarioOps->mapname;
|
|
- map = CMapService::loadMap(scenarioOps->mapname).release();
|
|
+ map = CMapService::loadMap(scenarioOps->mapname);
|
|
}
|
|
}
|
|
break;
|
|
@@ -909,7 +909,7 @@
|
|
|
|
std::string & mapContent = campaign->camp->mapPieces[scenarioOps->campState->currentMap];
|
|
auto buffer = reinterpret_cast<const ui8 *>(mapContent.data());
|
|
- map = CMapService::loadMap(buffer, mapContent.size()).release();
|
|
+ map = CMapService::loadMap(buffer, mapContent.size());
|
|
}
|
|
break;
|
|
case StartInfo::DUEL:
|
|
Index: lib/logging/CLogger.h
|
|
===================================================================
|
|
--- lib/logging/CLogger.h (revision 3494)
|
|
+++ lib/logging/CLogger.h (working copy)
|
|
@@ -289,3 +289,11 @@
|
|
CLogFormatter formatter;
|
|
mutable boost::mutex mx;
|
|
};
|
|
+
|
|
+#ifdef ANDROID
|
|
+static bool AndroidStaticInitLog()
|
|
+{
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Static init: %s", __SOURCE_FILE__);
|
|
+}
|
|
+static bool AndroidStaticInitLogFlag = AndroidStaticInitLog();
|
|
+#endif
|
|
Index: lib/logging/CLogger.cpp
|
|
===================================================================
|
|
--- lib/logging/CLogger.cpp (revision 3494)
|
|
+++ lib/logging/CLogger.cpp (working copy)
|
|
@@ -387,6 +387,9 @@
|
|
if(threshold > record.level) return;
|
|
|
|
std::string message = formatter.format(record);
|
|
+#ifdef ANDROID
|
|
+ __android_log_print(ANDROID_LOG_INFO, "VCMI", "%s", message.c_str());
|
|
+#endif
|
|
bool printToStdErr = record.level >= ELogLevel::WARN;
|
|
if(console)
|
|
{
|
|
Index: lib/Connection.h
|
|
===================================================================
|
|
--- lib/Connection.h (revision 3494)
|
|
+++ lib/Connection.h (working copy)
|
|
@@ -709,12 +709,14 @@
|
|
T *internalPtr = data.get();
|
|
*this << internalPtr;
|
|
}
|
|
+ /*
|
|
template <typename T>
|
|
void saveSerializable(const unique_ptr<T> &data)
|
|
{
|
|
T *internalPtr = data.get();
|
|
*this << internalPtr;
|
|
}
|
|
+ */
|
|
template <typename T>
|
|
void saveSerializable(const std::vector<T> &data)
|
|
{
|
|
@@ -1098,6 +1100,7 @@
|
|
else
|
|
data.reset();
|
|
}
|
|
+ /*
|
|
template <typename T>
|
|
void loadSerializable(unique_ptr<T> &data)
|
|
{
|
|
@@ -1105,6 +1108,7 @@
|
|
*this >> internalPtr;
|
|
data.reset(internalPtr);
|
|
}
|
|
+ */
|
|
template <typename T>
|
|
void loadSerializable(std::vector<T> &data)
|
|
{
|
|
Index: lib/VCMIDirs.cpp
|
|
===================================================================
|
|
--- lib/VCMIDirs.cpp (revision 3494)
|
|
+++ lib/VCMIDirs.cpp (working copy)
|
|
@@ -15,11 +15,16 @@
|
|
|
|
VCMIDirs::VCMIDirs()
|
|
{
|
|
+ char buf[1024] = "";
|
|
+ getcwd(buf, sizeof(buf));
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d: mkdir '%s' '%s' '%s' '%s' curdir '%s'", __FUNCTION__, __FILE__, __LINE__,
|
|
+ userDataPath().c_str(), userCachePath().c_str(), userConfigPath().c_str(), userSavePath().c_str(), buf);
|
|
// initialize local directory and create folders to which VCMI needs write access
|
|
boost::filesystem::create_directory(userDataPath());
|
|
boost::filesystem::create_directory(userCachePath());
|
|
boost::filesystem::create_directory(userConfigPath());
|
|
boost::filesystem::create_directory(userSavePath());
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
}
|
|
|
|
VCMIDirs & VCMIDirs::get()
|
|
@@ -115,8 +120,10 @@
|
|
|
|
std::string VCMIDirs::userDataPath() const
|
|
{
|
|
+#ifndef ANDROID
|
|
if (getenv("HOME") != nullptr )
|
|
return std::string(getenv("HOME")) + "/.vcmi";
|
|
+#endif
|
|
return ".";
|
|
}
|
|
|
|
Index: lib/vcmi_endian.h
|
|
===================================================================
|
|
--- lib/vcmi_endian.h (revision 3494)
|
|
+++ lib/vcmi_endian.h (working copy)
|
|
@@ -19,7 +19,7 @@
|
|
* memory. On big endian machines, the value will be byteswapped.
|
|
*/
|
|
|
|
-#if defined(linux) && (defined(sparc) || defined(__arm__))
|
|
+#if defined(ANDROID) || defined(linux) && (defined(sparc) || defined(__arm__))
|
|
/* SPARC does not support unaligned memory access. Let gcc know when
|
|
* to emit the right code. */
|
|
struct unaligned_Uint16 { ui16 val __attribute__(( packed )); };
|
|
Index: lib/CGeneralTextHandler.cpp
|
|
===================================================================
|
|
--- lib/CGeneralTextHandler.cpp (revision 3494)
|
|
+++ lib/CGeneralTextHandler.cpp (working copy)
|
|
@@ -40,10 +40,10 @@
|
|
|
|
void CLegacyConfigParser::init(const std::unique_ptr<CInputStream> & input)
|
|
{
|
|
- data.reset(new char[input->getSize()]);
|
|
- input->read((ui8*)data.get(), input->getSize());
|
|
+ data.resize(input->getSize());
|
|
+ input->read((ui8*)data.data(), input->getSize());
|
|
|
|
- curr = data.get();
|
|
+ curr = data.data();
|
|
end = curr + input->getSize();
|
|
}
|
|
|
|
Index: lib/filesystem/CInputStream.h
|
|
===================================================================
|
|
--- lib/filesystem/CInputStream.h (revision 3494)
|
|
+++ lib/filesystem/CInputStream.h (working copy)
|
|
@@ -65,13 +65,13 @@
|
|
*
|
|
* @return pair, first = raw data, second = size of data
|
|
*/
|
|
- std::pair<std::unique_ptr<ui8[]>, size_t> readAll()
|
|
+ std::vector<ui8> readAll()
|
|
{
|
|
- std::unique_ptr<ui8[]> data(new ui8[getSize()]);
|
|
+ std::vector<ui8> data(getSize());
|
|
|
|
- size_t readSize = read(data.get(), getSize());
|
|
+ size_t readSize = read(data.data(), getSize());
|
|
assert(readSize == getSize());
|
|
|
|
- return std::make_pair(std::move(data), getSize());
|
|
+ return data;
|
|
}
|
|
};
|
|
Index: lib/filesystem/Filesystem.cpp
|
|
===================================================================
|
|
--- lib/filesystem/Filesystem.cpp (revision 3494)
|
|
+++ lib/filesystem/Filesystem.cpp (working copy)
|
|
@@ -24,14 +24,14 @@
|
|
|
|
ResourceID::ResourceID(std::string name)
|
|
{
|
|
- CFileInfo info(std::move(name));
|
|
+ CFileInfo info(/*std::move*/(name));
|
|
setName(info.getStem());
|
|
setType(info.getType());
|
|
}
|
|
|
|
ResourceID::ResourceID(std::string name, EResType::Type type)
|
|
{
|
|
- setName(std::move(name));
|
|
+ setName(/*std::move*/(name));
|
|
setType(type);
|
|
}
|
|
|
|
@@ -47,7 +47,7 @@
|
|
|
|
void ResourceID::setName(std::string name)
|
|
{
|
|
- this->name = std::move(name);
|
|
+ this->name = /*std::move*/(name);
|
|
|
|
size_t dotPos = this->name.find_last_of("/.");
|
|
|
|
@@ -227,7 +227,7 @@
|
|
if (filename)
|
|
{
|
|
auto configData = initialLoader->load(ResourceID(URI, EResType::TEXT))->readAll();
|
|
- const JsonNode config((char*)configData.first.get(), configData.second);
|
|
+ const JsonNode config((char*)configData.data(), configData.size());
|
|
resourceLoader->addLoader(new CMappedFileLoader(mountPoint, config), false);
|
|
}
|
|
}
|
|
@@ -236,7 +236,7 @@
|
|
{
|
|
auto fsConfigData = initialLoader->load(ResourceID(fsConfigURI, EResType::TEXT))->readAll();
|
|
|
|
- const JsonNode fsConfig((char*)fsConfigData.first.get(), fsConfigData.second);
|
|
+ const JsonNode fsConfig((char*)fsConfigData.data(), fsConfigData.size());
|
|
|
|
loadModFileSystem("", fsConfig["filesystem"]);
|
|
|
|
@@ -320,7 +320,7 @@
|
|
{
|
|
ResourceID modConfFile("mods/" + modName + "/mod", EResType::TEXT);
|
|
auto fsConfigData = initialLoader->load(modConfFile)->readAll();
|
|
- const JsonNode fsConfig((char*)fsConfigData.first.get(), fsConfigData.second);
|
|
+ const JsonNode fsConfig((char*)fsConfigData.data(), fsConfigData.size());
|
|
|
|
if (!fsConfig["filesystem"].isNull())
|
|
loadModFileSystem("mods/" + modName, fsConfig["filesystem"]);
|
|
Index: lib/filesystem/CFileInfo.cpp
|
|
===================================================================
|
|
--- lib/filesystem/CFileInfo.cpp (revision 3494)
|
|
+++ lib/filesystem/CFileInfo.cpp (working copy)
|
|
@@ -7,7 +7,7 @@
|
|
}
|
|
|
|
CFileInfo::CFileInfo(std::string name)
|
|
- : name(std::move(name))
|
|
+ : name(/*std::move*/(name))
|
|
{
|
|
|
|
}
|
|
Index: client/CAnimation.cpp
|
|
===================================================================
|
|
--- client/CAnimation.cpp (revision 3494)
|
|
+++ client/CAnimation.cpp (working copy)
|
|
@@ -109,8 +109,9 @@
|
|
|
|
auto data = CResourceHandler::get()->load(rid)->readAll();
|
|
cache.back().name = ResourceID(rid);
|
|
- cache.back().size = data.second;
|
|
- cache.back().data = data.first.release();
|
|
+ cache.back().size = data.size();
|
|
+ cache.back().data = new ui8[data.size()];
|
|
+ memcpy(cache.back().data, data.data(), data.size());
|
|
|
|
return cache.back().getCopy();
|
|
}
|
|
@@ -1037,7 +1038,7 @@
|
|
for(auto & loader : configList)
|
|
{
|
|
auto stream = loader->load(resID);
|
|
- std::unique_ptr<ui8[]> textData(new ui8[stream->getSize()]);
|
|
+ std::unique_ptr<ui8> textData(new ui8[stream->getSize()]);
|
|
stream->read(textData.get(), stream->getSize());
|
|
|
|
const JsonNode config((char*)textData.get(), stream->getSize());
|
|
Index: client/CPreGame.h
|
|
===================================================================
|
|
--- client/CPreGame.h (revision 3494)
|
|
+++ client/CPreGame.h (working copy)
|
|
@@ -307,7 +307,7 @@
|
|
* compOnlyTeamsCntGroup, * waterContentGroup, * monsterStrengthGroup;
|
|
CAdventureMapButton * showRandMaps;
|
|
CMapGenOptions mapGenOptions;
|
|
- unique_ptr<CMapInfo> mapInfo;
|
|
+ shared_ptr<CMapInfo> mapInfo;
|
|
CFunctionList<void(const CMapInfo *)> mapInfoChanged;
|
|
};
|
|
|
|
@@ -495,7 +495,7 @@
|
|
|
|
void loadPositionsOfGraphics();
|
|
shared_ptr<CCampaignState> ourCampaign;
|
|
- CMapHeader *ourHeader;
|
|
+ std::shared_ptr<CMapHeader> ourHeader;
|
|
CDefHandler *sizes; //icons of map sizes
|
|
SDL_Surface* diffPics[5]; //pictures of difficulties, user-selectable (or not if campaign locks this)
|
|
CAdventureMapButton * diffLb, * diffRb; //buttons for changing difficulty
|
|
Index: client/Graphics.cpp
|
|
===================================================================
|
|
--- client/Graphics.cpp (revision 3494)
|
|
+++ client/Graphics.cpp (working copy)
|
|
@@ -48,7 +48,7 @@
|
|
void Graphics::loadPaletteAndColors()
|
|
{
|
|
auto textFile = CResourceHandler::get()->load(ResourceID("DATA/PLAYERS.PAL"))->readAll();
|
|
- std::string pals((char*)textFile.first.get(), textFile.second);
|
|
+ std::string pals((char*)textFile.data(), textFile.size());
|
|
|
|
playerColorPalette = new SDL_Color[256];
|
|
neutralColor = new SDL_Color;
|
|
Index: client/CMT.cpp
|
|
===================================================================
|
|
--- client/CMT.cpp (revision 3494)
|
|
+++ client/CMT.cpp (working copy)
|
|
@@ -194,7 +194,7 @@
|
|
|
|
#ifdef _WIN32
|
|
int wmain(int argc, wchar_t* argv[])
|
|
-#elif defined(__APPLE__)
|
|
+#elif defined(__APPLE__) || defined(ANDROID)
|
|
int SDL_main(int argc, char *argv[])
|
|
#else
|
|
int main(int argc, char** argv)
|
|
@@ -217,6 +217,13 @@
|
|
}
|
|
fclose(check);
|
|
#endif
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
+
|
|
+ // Fix crashing locale shit in Boost
|
|
+ setenv( "LANG", "C", 1 );
|
|
+ setenv( "LANGUAGE", "C", 1 );
|
|
+ setenv( "LC_ALL", "C", 1 );
|
|
+
|
|
std::cout << "Starting... " << std::endl;
|
|
po::options_description opts("Allowed options");
|
|
opts.add_options()
|
|
@@ -289,6 +296,7 @@
|
|
|
|
// Initialize logging based on settings
|
|
logConfig.configure();
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
|
|
// Some basic data validation to produce better error messages in cases of incorrect install
|
|
auto testFile = [](std::string filename, std::string message) -> bool
|
|
@@ -300,22 +308,31 @@
|
|
return false;
|
|
};
|
|
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
if (!testFile("DATA/HELP.TXT", "Heroes III data") ||
|
|
!testFile("MODS/VCMI/MOD.JSON", "VCMI mod") ||
|
|
- !testFile("DATA/StackQueueBgBig.PCX", "VCMI data"))
|
|
+ !testFile("DATA/StackQueueBgBig.PCX", "VCMI data"))
|
|
+ {
|
|
+ __android_log_print(ANDROID_LOG_ERROR, "VCMI", "Cannot find data files!");
|
|
exit(1); // These are unrecoverable errors
|
|
+ }
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
|
|
// these two are optional + some installs have them on CD and not in data directory
|
|
testFile("VIDEO/GOOD1A.SMK", "campaign movies");
|
|
testFile("SOUNDS/G1A.WAV", "campaign music"); //technically not a music but voiced intro sounds
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
conf.init();
|
|
logGlobal->infoStream() <<"Loading settings: "<<pomtime.getDiff();
|
|
logGlobal->infoStream() << NAME;
|
|
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
srand ( time(nullptr) );
|
|
|
|
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
const JsonNode& video = settings["video"];
|
|
const JsonNode& res = video["screenRes"];
|
|
|
|
@@ -330,6 +347,7 @@
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Trace: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
if(!gNoGUI)
|
|
{
|
|
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO))
|
|
@@ -360,7 +378,8 @@
|
|
|
|
|
|
//we can properly play intro only in the main thread, so we have to move loading to the separate thread
|
|
- boost::thread loading(init);
|
|
+ //boost::thread loading(init);
|
|
+ init(); // boost::thread crashes when destroyed
|
|
|
|
if(!gNoGUI )
|
|
{
|
|
@@ -370,8 +389,8 @@
|
|
}
|
|
|
|
CSDL_Ext::update(screen);
|
|
- loading.join();
|
|
- logGlobal->infoStream()<<"Initialization of VCMI (together): "<<total.getDiff();
|
|
+ //loading.join();
|
|
+ logGlobal->infoStream()<<"Initialization of VCMI (together): "<<total.getDiff();
|
|
|
|
if(!vm.count("battle"))
|
|
{
|
|
@@ -550,7 +569,7 @@
|
|
std::ofstream file(outName + ".TXT");
|
|
auto text = CResourceHandler::get()->load(filename)->readAll();
|
|
|
|
- file.write((char*)text.first.get(), text.second);
|
|
+ file.write((char*)text.data(), text.size());
|
|
}
|
|
|
|
std::cout << "\rExtracting done :)\n";
|
|
@@ -689,7 +708,7 @@
|
|
|
|
boost::filesystem::create_directories(fullPath.substr(0, fullPath.find_last_of("/")));
|
|
std::ofstream outFile(outPath + outName);
|
|
- outFile.write((char*)data.first.get(), data.second);
|
|
+ outFile.write((char*)data.data(), data.size());
|
|
}
|
|
else
|
|
logGlobal->errorStream() << "File not found!";
|
|
Index: client/CDefHandler.cpp
|
|
===================================================================
|
|
--- client/CDefHandler.cpp (revision 3494)
|
|
+++ client/CDefHandler.cpp (working copy)
|
|
@@ -364,11 +364,11 @@
|
|
{
|
|
ResourceID resID(std::string("SPRITES/") + defName, EResType::ANIMATION);
|
|
|
|
- auto data = CResourceHandler::get()->load(resID)->readAll().first;
|
|
- if(!data)
|
|
+ auto data = CResourceHandler::get()->load(resID)->readAll();
|
|
+ if(!data.size())
|
|
throw std::runtime_error("bad def name!");
|
|
auto nh = new CDefHandler();
|
|
- nh->openFromMemory(data.get(), defName);
|
|
+ nh->openFromMemory(data.data(), defName);
|
|
return nh;
|
|
}
|
|
CDefEssential * CDefHandler::giveDefEss(const std::string & defName)
|
|
Index: client/CBitmapHandler.cpp
|
|
===================================================================
|
|
--- client/CBitmapHandler.cpp (revision 3494)
|
|
+++ client/CBitmapHandler.cpp (working copy)
|
|
@@ -114,9 +114,9 @@
|
|
|
|
auto readFile = CResourceHandler::get()->load(ResourceID(path + fname, EResType::IMAGE))->readAll();
|
|
|
|
- if (isPCX(readFile.first.get()))
|
|
+ if (isPCX(readFile.data()))
|
|
{//H3-style PCX
|
|
- ret = loadH3PCX(readFile.first.get(), readFile.second);
|
|
+ ret = loadH3PCX(readFile.data(), readFile.size());
|
|
if (ret)
|
|
{
|
|
if(ret->format->BytesPerPixel == 1 && setKey)
|
|
@@ -132,7 +132,7 @@
|
|
{ //loading via SDL_Image
|
|
ret = IMG_Load_RW(
|
|
//create SDL_RW with our data (will be deleted by SDL)
|
|
- SDL_RWFromConstMem((void*)readFile.first.get(), readFile.second),
|
|
+ SDL_RWFromConstMem((void*)readFile.data(), readFile.size()),
|
|
1); // mark it for auto-deleting
|
|
if (ret)
|
|
{
|
|
Index: client/CPreGame.cpp
|
|
===================================================================
|
|
--- client/CPreGame.cpp (revision 3494)
|
|
+++ client/CPreGame.cpp (working copy)
|
|
@@ -404,7 +404,7 @@
|
|
pos.w = CGP->menu->pos.w;
|
|
pos.h = CGP->menu->pos.h;
|
|
auto textFile = CResourceHandler::get()->load(ResourceID("DATA/CREDITS.TXT"))->readAll();
|
|
- std::string text((char*)textFile.first.get(), textFile.second);
|
|
+ std::string text((char*)textFile.data(), textFile.size());
|
|
size_t firstQuote = text.find('\"')+1;
|
|
text = text.substr(firstQuote, text.find('\"', firstQuote) - firstQuote );
|
|
credits = new CTextBox(text, Rect(pos.w - 350, 600, 350, 32000), 0, FONT_CREDITS, CENTER, Colors::WHITE);
|
|
@@ -1105,9 +1105,11 @@
|
|
|
|
void SelectionTab::parseMaps(const std::unordered_set<ResourceID> &files)
|
|
{
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
allItems.clear();
|
|
for(auto & file : files)
|
|
{
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "checking file %s", file.getName().c_str());
|
|
try
|
|
{
|
|
CMapInfo mapInfo;
|
|
@@ -1115,13 +1117,15 @@
|
|
|
|
// ignore unsupported map versions (e.g. WoG maps without WoG
|
|
if (mapInfo.mapHeader->version <= CGI->modh->settings.data["textData"]["mapVersion"].Float())
|
|
- allItems.push_back(std::move(mapInfo));
|
|
+ allItems.push_back(/*std::move*/(mapInfo));
|
|
}
|
|
catch(std::exception & e)
|
|
{
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "Error loading file %s", file.getName().c_str());
|
|
logGlobal->errorStream() << "Map " << file.getName() << " is invalid. Message: " << e.what();
|
|
}
|
|
}
|
|
+ __android_log_print(ANDROID_LOG_DEBUG, "VCMI", "%s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
|
|
}
|
|
|
|
void SelectionTab::parseGames(const std::unordered_set<ResourceID> &files, bool multi)
|
|
@@ -1141,7 +1145,7 @@
|
|
|
|
// Create the map info object
|
|
CMapInfo mapInfo;
|
|
- mapInfo.mapHeader = make_unique<CMapHeader>();
|
|
+ mapInfo.mapHeader = std::make_shared<CMapHeader>(CMapHeader());
|
|
mapInfo.scenarioOpts = new StartInfo;
|
|
lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts;
|
|
mapInfo.fileURI = file.getName();
|
|
@@ -1834,9 +1838,9 @@
|
|
void CRandomMapTab::updateMapInfo()
|
|
{
|
|
// Generate header info
|
|
- mapInfo = make_unique<CMapInfo>();
|
|
+ mapInfo = make_shared<CMapInfo>();
|
|
mapInfo->isRandomMap = true;
|
|
- mapInfo->mapHeader = make_unique<CMapHeader>();
|
|
+ mapInfo->mapHeader = std::make_shared<CMapHeader>(CMapHeader());
|
|
mapInfo->mapHeader->version = EMapFormat::SOD;
|
|
mapInfo->mapHeader->name = CGI->generaltexth->allTexts[740];
|
|
mapInfo->mapHeader->description = CGI->generaltexth->allTexts[741];
|
|
@@ -3256,7 +3260,7 @@
|
|
{
|
|
SDL_FreeSurface(background);
|
|
delete sizes;
|
|
- delete ourHeader;
|
|
+ ourHeader.reset();
|
|
delete sFlags;
|
|
for (auto & elem : diffPics)
|
|
{
|
|
@@ -3320,14 +3324,14 @@
|
|
ourCampaign->currentMap = whichOne;
|
|
|
|
//get header
|
|
- delete ourHeader;
|
|
+ //delete ourHeader;
|
|
std::string & headerStr = ourCampaign->camp->mapPieces.find(whichOne)->second;
|
|
auto buffer = reinterpret_cast<const ui8 *>(headerStr.data());
|
|
- ourHeader = CMapService::loadMapHeader(buffer, headerStr.size()).release();
|
|
+ ourHeader = CMapService::loadMapHeader(buffer, headerStr.size());
|
|
|
|
std::map<ui8, std::string> names;
|
|
names[1] = settings["general"]["playerName"].String();
|
|
- updateStartInfo(ourCampaign->camp->header.filename, sInfo, ourHeader, names);
|
|
+ updateStartInfo(ourCampaign->camp->header.filename, sInfo, ourHeader.get(), names);
|
|
sInfo.turnTime = 0;
|
|
sInfo.difficulty = ourCampaign->camp->scenarios[whichOne].difficulty;
|
|
|
|
Index: client/Client.cpp
|
|
===================================================================
|
|
--- client/Client.cpp (revision 3494)
|
|
+++ client/Client.cpp (working copy)
|
|
@@ -252,7 +252,7 @@
|
|
}
|
|
logNetwork->infoStream() << "Loaded common part of save " << tmh.getDiff();
|
|
const_cast<CGameInfo*>(CGI)->mh = new CMapHandler();
|
|
- const_cast<CGameInfo*>(CGI)->mh->map = gs->map;
|
|
+ const_cast<CGameInfo*>(CGI)->mh->map = gs->map.get();
|
|
pathInfo = make_unique<CPathsInfo>(getMapSize());
|
|
CGI->mh->init();
|
|
logNetwork->infoStream() <<"Initing maphandler: "<<tmh.getDiff();
|
|
@@ -358,7 +358,7 @@
|
|
if(gs->map)
|
|
{
|
|
const_cast<CGameInfo*>(CGI)->mh = new CMapHandler();
|
|
- CGI->mh->map = gs->map;
|
|
+ CGI->mh->map = gs->map.get();
|
|
logNetwork->infoStream() <<"Creating mapHandler: "<<tmh.getDiff();
|
|
CGI->mh->init();
|
|
pathInfo = make_unique<CPathsInfo>(getMapSize());
|
|
Index: client/CVideoHandler.cpp
|
|
===================================================================
|
|
--- client/CVideoHandler.cpp (revision 3494)
|
|
+++ client/CVideoHandler.cpp (working copy)
|
|
@@ -415,7 +415,7 @@
|
|
auto data = CResourceHandler::get()->load(videoID)->readAll();
|
|
|
|
// try to determine video format using magic number from header (3 bytes, SMK or BIK)
|
|
- std::string magic(reinterpret_cast<char*>(data.first.get()), 3);
|
|
+ std::string magic(reinterpret_cast<char*>(data.data()), 3);
|
|
if (magic == "BIK")
|
|
current = &bikPlayer;
|
|
else if (magic == "SMK")
|
|
Index: client/CMusicHandler.cpp
|
|
===================================================================
|
|
--- client/CMusicHandler.cpp (revision 3494)
|
|
+++ client/CMusicHandler.cpp (working copy)
|
|
@@ -141,7 +141,9 @@
|
|
{
|
|
auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + fname, EResType::SOUND))->readAll();
|
|
|
|
- SDL_RWops *ops = SDL_RWFromMem(data.first.release(), data.second);
|
|
+ char *buf = new char[data.size()]; // Never release it
|
|
+ memcpy(buf, data.data(), data.size());
|
|
+ SDL_RWops *ops = SDL_RWFromMem(buf, data.size());
|
|
Mix_Chunk *chunk;
|
|
chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
|
|
soundChunks.insert(std::pair<soundBase::soundID, Mix_Chunk *>(soundID, chunk));
|
|
@@ -164,7 +166,9 @@
|
|
{
|
|
auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll();
|
|
|
|
- SDL_RWops *ops = SDL_RWFromMem(data.first.release(), data.second);
|
|
+ char *buf = new char[data.size()]; // Never release it
|
|
+ memcpy(buf, data.data(), data.size());
|
|
+ SDL_RWops *ops = SDL_RWFromMem(buf, data.size());
|
|
Mix_Chunk *chunk;
|
|
chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
|
|
return chunk;
|
|
@@ -400,11 +404,11 @@
|
|
|
|
boost::mutex::scoped_lock guard(musicMutex);
|
|
|
|
- next = std::move(queued);
|
|
+ next = /*std::move*/(queued);
|
|
|
|
if (current.get() == nullptr || !current->stop(1000))
|
|
{
|
|
- current.reset(next.release());
|
|
+ current = next;
|
|
current->play();
|
|
}
|
|
}
|
|
@@ -457,7 +461,7 @@
|
|
|
|
if (current.get() == nullptr && next.get() != nullptr)
|
|
{
|
|
- current.reset(next.release());
|
|
+ current = next;
|
|
current->play();
|
|
}
|
|
}
|
|
@@ -496,7 +500,9 @@
|
|
logGlobal->traceStream()<<"Loading music file "<<musicURI;
|
|
|
|
auto data = CResourceHandler::get()->load(ResourceID(musicURI, EResType::MUSIC))->readAll();
|
|
- musicFile = SDL_RWFromConstMem(data.first.release(), data.second);
|
|
+ char *buf = new char[data.size()]; // Never release it
|
|
+ memcpy(buf, data.data(), data.size());
|
|
+ musicFile = SDL_RWFromConstMem(buf, data.size());
|
|
music = Mix_LoadMUS_RW(musicFile);
|
|
|
|
if(!music)
|
|
Index: client/battle/CCreatureAnimation.h
|
|
===================================================================
|
|
--- client/battle/CCreatureAnimation.h (revision 3494)
|
|
+++ client/battle/CCreatureAnimation.h (working copy)
|
|
@@ -66,8 +66,7 @@
|
|
|
|
//animation raw data
|
|
//TODO: use vector instead?
|
|
- unique_ptr<ui8[]> pixelData;
|
|
- size_t pixelDataSize;
|
|
+ std::vector<ui8> pixelData;
|
|
|
|
// speed of animation, measure in frames per second
|
|
float speed;
|
|
Index: client/battle/CCreatureAnimation.cpp
|
|
===================================================================
|
|
--- client/battle/CCreatureAnimation.cpp (revision 3494)
|
|
+++ client/battle/CCreatureAnimation.cpp (working copy)
|
|
@@ -159,11 +159,10 @@
|
|
|
|
auto data = CResourceHandler::get()->load(resID)->readAll();
|
|
|
|
- pixelData = std::move(data.first);
|
|
- pixelDataSize = data.second;
|
|
+ pixelData = data;
|
|
}
|
|
|
|
- CBinaryReader reader(new CMemoryStream(pixelData.get(), pixelDataSize));
|
|
+ CBinaryReader reader(new CMemoryStream(pixelData.data(), pixelData.size()));
|
|
|
|
reader.readInt32(); // def type, unused
|
|
|
|
@@ -307,7 +306,7 @@
|
|
|
|
ui32 offset = dataOffsets.at(type).at(floor(currentFrame));
|
|
|
|
- CBinaryReader reader(new CMemoryStream(pixelData.get(), pixelDataSize));
|
|
+ CBinaryReader reader(new CMemoryStream(pixelData.data(), pixelData.size()));
|
|
|
|
reader.getStream()->seek(offset);
|
|
|
|
@@ -332,7 +331,7 @@
|
|
for (ui32 i=0; i<spriteHeight; i++)
|
|
{
|
|
//NOTE: if this loop will be optimized to skip empty lines - recheck this read access
|
|
- ui8 * lineData = pixelData.get() + baseOffset + reader.readUInt32();
|
|
+ ui8 * lineData = pixelData.data() + baseOffset + reader.readUInt32();
|
|
|
|
size_t destX = pos.x;
|
|
if (rotate)
|
|
Index: client/gui/Fonts.cpp
|
|
===================================================================
|
|
--- client/gui/Fonts.cpp (revision 3494)
|
|
+++ client/gui/Fonts.cpp (working copy)
|
|
@@ -79,15 +79,15 @@
|
|
|
|
for (auto & elem : ret)
|
|
{
|
|
- elem.leftOffset = read_le_u32(data.first.get() + offset); offset+=4;
|
|
- elem.width = read_le_u32(data.first.get() + offset); offset+=4;
|
|
- elem.rightOffset = read_le_u32(data.first.get() + offset); offset+=4;
|
|
+ elem.leftOffset = read_le_u32(data.data() + offset); offset+=4;
|
|
+ elem.width = read_le_u32(data.data() + offset); offset+=4;
|
|
+ elem.rightOffset = read_le_u32(data.data() + offset); offset+=4;
|
|
}
|
|
|
|
for (auto & elem : ret)
|
|
{
|
|
- int pixelOffset = read_le_u32(data.first.get() + offset); offset+=4;
|
|
- elem.pixels = data.first.get() + 4128 + pixelOffset;
|
|
+ int pixelOffset = read_le_u32(data.data() + offset); offset+=4;
|
|
+ elem.pixels = (ui8*)data.data() + 4128 + pixelOffset;
|
|
|
|
assert(pixelOffset + 4128 < data.second);
|
|
}
|
|
@@ -97,7 +97,7 @@
|
|
CBitmapFont::CBitmapFont(const std::string & filename):
|
|
data(CResourceHandler::get()->load(ResourceID("data/" + filename, EResType::BMP_FONT))->readAll()),
|
|
chars(loadChars()),
|
|
- height(data.first.get()[5])
|
|
+ height(data.data()[5])
|
|
{}
|
|
|
|
size_t CBitmapFont::getLineHeight() const
|
|
@@ -195,7 +195,7 @@
|
|
SDL_UnlockSurface(surface);
|
|
}
|
|
|
|
-std::pair<std::unique_ptr<ui8[]>, ui64> CTrueTypeFont::loadData(const JsonNode & config)
|
|
+std::vector<ui8> CTrueTypeFont::loadData(const JsonNode & config)
|
|
{
|
|
std::string filename = "Data/" + config["file"].String();
|
|
return CResourceHandler::get()->load(ResourceID(filename, EResType::TTF_FONT))->readAll();
|
|
@@ -208,7 +208,7 @@
|
|
if(!TTF_WasInit() && TTF_Init()==-1)
|
|
throw std::runtime_error(std::string("Failed to initialize true type support: ") + TTF_GetError() + "\n");
|
|
|
|
- return TTF_OpenFontRW(SDL_RWFromConstMem(data.first.get(), data.second), 1, pointSize);
|
|
+ return TTF_OpenFontRW(SDL_RWFromConstMem(data.data(), data.size()), 1, pointSize);
|
|
}
|
|
|
|
int CTrueTypeFont::getFontStyle(const JsonNode &config)
|
|
@@ -227,7 +227,7 @@
|
|
|
|
CTrueTypeFont::CTrueTypeFont(const JsonNode & fontConfig):
|
|
data(loadData(fontConfig)),
|
|
- font(loadFont(fontConfig), TTF_CloseFont),
|
|
+ font(loadFont(fontConfig), &TTF_CloseFont),
|
|
blended(fontConfig["blend"].Bool())
|
|
{
|
|
assert(font);
|
|
Index: client/gui/Fonts.h
|
|
===================================================================
|
|
--- client/gui/Fonts.h (revision 3494)
|
|
+++ client/gui/Fonts.h (working copy)
|
|
@@ -68,7 +68,7 @@
|
|
ui8 *pixels; // pixels of this character, part of BitmapFont::data
|
|
};
|
|
|
|
- const std::pair<std::unique_ptr<ui8[]>, ui64> data;
|
|
+ std::vector<ui8> data;
|
|
|
|
const std::array<Char, totalChars> chars;
|
|
const ui8 height;
|
|
@@ -88,12 +88,12 @@
|
|
|
|
class CTrueTypeFont : public IFont
|
|
{
|
|
- const std::pair<std::unique_ptr<ui8[]>, ui64> data;
|
|
+ std::vector<ui8> data;
|
|
|
|
- const std::unique_ptr<TTF_Font, void (*)(TTF_Font*)> font;
|
|
+ const std::unique_ptr<TTF_Font> font;
|
|
const bool blended;
|
|
|
|
- std::pair<std::unique_ptr<ui8[]>, ui64> loadData(const JsonNode & config);
|
|
+ std::vector<ui8> loadData(const JsonNode & config);
|
|
TTF_Font * loadFont(const JsonNode & config);
|
|
int getFontStyle(const JsonNode & config);
|
|
|
|
Index: Global.h
|
|
===================================================================
|
|
--- Global.h (revision 3494)
|
|
+++ Global.h (working copy)
|
|
@@ -62,7 +62,35 @@
|
|
|
|
#include <cstdio>
|
|
#include <stdio.h>
|
|
-
|
|
+#ifdef ANDROID
|
|
+/*
|
|
+#define move disable_move // It crashes with NDK r9 and GCC 4.8
|
|
+#include <algorithm>
|
|
+#undef move
|
|
+namespace std
|
|
+{
|
|
+ template<typename _Tp>
|
|
+ _Tp move(_Tp __t)
|
|
+ {
|
|
+ return __t; // Unoptimized version that does not crash
|
|
+ }
|
|
+
|
|
+ template<class InputIt, class OutputIt>
|
|
+ OutputIt move(InputIt first, InputIt last, OutputIt d_first)
|
|
+ {
|
|
+ while (first != last)
|
|
+ {
|
|
+ *d_first++ = *first++;
|
|
+ }
|
|
+ return d_first;
|
|
+ }
|
|
+}
|
|
+*/
|
|
+/*
|
|
+#include <memory>
|
|
+#define unique_ptr shared_ptr
|
|
+*/
|
|
+#endif
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <cassert>
|
|
@@ -129,6 +157,8 @@
|
|
using std::make_shared;
|
|
//using namespace std::placeholders;
|
|
namespace range = boost::range;
|
|
+#define unique_ptr shared_ptr
|
|
+#define make_unique make_shared
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* Typedefs */
|