From: Marco Costalba Date: Wed, 9 May 2012 07:33:25 +0000 (+0200) Subject: Fix compilation with Android NDK X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=caef31921900e092616c56193e37201b08baa875 Fix compilation with Android NDK It seems ADL lookup is broken with the STLPort library. Peter says: The compiler is gcc 4.4.3, but I don't know how many patches they have applied to it. I think gcc has had support for Koenig lookup a long time. I think the problem is the type of the vector iterator. For example, line 272 in search.cpp: if (bookMove && count(RootMoves.begin(), RootMoves.end(), bookMove)) gives the error: jni/stockfish/search.cpp:272: error: 'count' was not declared in this scope Here RootMoves is: std::vector RootMoves; If std::vector::iterator is implemented as T*, then Koenig lookup would fail because RootMove* is not in namespace std. I compile with the stlport implementation of STL, which in its vector class has: typedef value_type* iterator; I'm not sure if this is allowed by the C++ standard. I did not find anything that says the iterator type must belong to namespace std. The consensus in this thread http://compgroups.net/comp.lang.c++.moderated/argument-dependent-lookup/433395 is that the stlport iterator type is allowed. Report and patch by Peter Osterlund. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/endgame.cpp b/src/endgame.cpp index a3961840..feaf59aa 100644 --- a/src/endgame.cpp +++ b/src/endgame.cpp @@ -72,7 +72,7 @@ namespace { string sides[] = { code.substr(code.find('K', 1)), // Weaker code.substr(0, code.find('K', 1)) }; // Stronger - transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower); + std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower); string fen = sides[0] + char('0' + int(8 - code.length())) + sides[1] + "/8/8/8/8/8/8/8 w - - 0 10"; diff --git a/src/search.cpp b/src/search.cpp index d711d743..27365069 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -51,6 +51,11 @@ using std::endl; using Eval::evaluate; using namespace Search; +// For some reason argument-dependent lookup (ADL) doesn't work for Android's +// STLPort, so explicitly qualify following functions. +using std::count; +using std::find; + namespace { // Set to true to force running with one thread. Used for debugging diff --git a/src/types.h b/src/types.h index cf0b3f95..02e2d455 100644 --- a/src/types.h +++ b/src/types.h @@ -35,6 +35,7 @@ /// | only in 64-bit mode. For compiling requires hardware with /// | popcnt support. +#include #include #include diff --git a/src/ucioption.cpp b/src/ucioption.cpp index 4be580fc..4761004d 100644 --- a/src/ucioption.cpp +++ b/src/ucioption.cpp @@ -45,7 +45,7 @@ bool ci_less(char c1, char c2) { return tolower(c1) < tolower(c2); } } bool CaseInsensitiveLess::operator() (const string& s1, const string& s2) const { - return lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), ci_less); + return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), ci_less); }