#include <string>
#include <map>

enum class toolchain
{
    GNU, // GCC+GNU binutils
    Microsoft, // cl.exe and link.exe
    LLVM, // Clang+GNU binutils (may change later)
    Intel // ICC+platform linker
    // ...
};

enum class generator_string
{
    compiler, // compiler program name (without target prefixes)
    linker, // linker program name
    output_argument, // precedes output file name
    compile_argument, // compile to object file
};

typedef std::map<toolchain, std::map<generator_string, std::string> > generator_map;

const generator_map cgenerator_map =
         { { toolchain::GNU,
             { {generator_string::compiler,          "gcc"},
               {generator_string::linker,            "gcc"},
               {generator_string::output_argument,   "-o"},
               {generator_string::compile_argument,  "-c"} } },
           { toolchain::Microsoft,
             { {generator_string::compiler,         "cl"},
               {generator_string::linker,           "link"},
               {generator_string::output_argument,  ""},
               {generator_string::compile_argument, "/c"} } },
           { toolchain::LLVM,
             { {generator_string::compiler,         "clang++"} } },
           { toolchain::Intel,
             { {generator_string::compiler,         "icc"} } } };
