# - Finds if the compiler has C++11 support
# This module can be used to detect compiler flags for using C++11, and checks
# a small subset of the language.
#
# The following variables are set:
#   CXX11_FLAGS - flags to add to the CXX compiler for C++11 support
#   CXX11_FOUND - true if the compiler supports C++11
#

if(CXX11_FLAGS)
    set(CXX11_FOUND TRUE)
    return()
endif()

include(CheckCXXSourceCompiles)
include(FindPackageHandleStandardArgs)

if(MSVC)
    set(CXX11_FLAG_CANDIDATES
	    " "
        )
else()
    set(CXX11_FLAG_CANDIDATES
        #gcc
        "-std=gnu++11"
        "-std=gnu++0x"
        #Gnu and Intel Linux
        "-std=c++11"
        "-std=c++0x"
        #Microsoft Visual Studio, and everything that automatically accepts C++11
        " "
        #Intel windows
        "/Qstd=c++11"
        "/Qstd=c++0x"
        )
endif()

set(CXX11_TEST_SOURCE
"
int main()
{
    int n[] = {4,7,6,1,2};
	int r;
	auto f = [&](int j) { r = j; };
	
    for (auto i : n)
        f(i);
    return 0;
}
")

foreach(FLAG ${CXX11_FLAG_CANDIDATES})
    set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
    set(CMAKE_REQUIRED_FLAGS "${FLAG}")
    unset(CXX11_FLAG_DETECTED CACHE)
    message(STATUS "Try C++11 flag = [${FLAG}]")
    check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)
    set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
    if(CXX11_FLAG_DETECTED)
        set(CXX11_FLAGS_INTERNAL "${FLAG}")
        break()
    endif(CXX11_FLAG_DETECTED)
endforeach(FLAG ${CXX11_FLAG_CANDIDATES})

set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}" CACHE STRING "C++11 Flags")

find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS)
mark_as_advanced(CXX11_FLAGS)
