$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r70643 - trunk/libs/geometry/doc/src/docutils/tools/implementation_status
From: barend.gehrels_at_[hidden]
Date: 2011-03-27 14:45:19
Author: barendgehrels
Date: 2011-03-27 14:45:19 EDT (Sun, 27 Mar 2011)
New Revision: 70643
URL: http://svn.boost.org/trac/boost/changeset/70643
Log:
bjam/msvc is now a policy. 
Text files modified: 
   trunk/libs/geometry/doc/src/docutils/tools/implementation_status/implementation_status.cpp |    96 ++++++++++++++++++++++++++++++++------- 
   1 files changed, 79 insertions(+), 17 deletions(-)
Modified: trunk/libs/geometry/doc/src/docutils/tools/implementation_status/implementation_status.cpp
==============================================================================
--- trunk/libs/geometry/doc/src/docutils/tools/implementation_status/implementation_status.cpp	(original)
+++ trunk/libs/geometry/doc/src/docutils/tools/implementation_status/implementation_status.cpp	2011-03-27 14:45:19 EDT (Sun, 27 Mar 2011)
@@ -13,6 +13,7 @@
 
 #include <stdlib.h>
 
+#include <boost/timer.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/algorithm/string/trim.hpp>
@@ -29,6 +30,52 @@
 static const int geometry_count = 9;
 
 
+struct compile_bjam
+{
+    static inline bool apply(int type1, int type2)
+    {
+        std::ostringstream command;
+        // For debugging: 
+        command << "bjam -a tmp > tmp/t" << type1 << "_" << type2 << ".out";
+        //command << "bjam -a tmp > tmp/t.out";
+        int failed = system(command.str().c_str());
+        return failed == 0;
+    }
+};
+
+struct compile_msvc
+{
+    bool first;
+    int count;
+
+    compile_msvc()
+        : first(true)
+        , count(0)
+    {}
+
+    inline bool apply(int type1, int type2)
+    {
+        std::ostringstream command;
+        command << "cl /nologo -I. -I/_svn/boost/trunk /EHsc /Y";
+        if (first)
+        {
+            std::cout << " (creating PCH)";
+            command << "c";
+            first = false;
+        }
+        else
+        {
+            command <<  "u";
+        }
+
+        command << "implementation_status.hpp tmp/t.cpp > tmp/t.out";
+            // For debugging: << type1 << "_" << type2 << ".out"; 
+
+        int failed = system(command.str().c_str());
+        return failed == 0;
+    }
+};
+
 struct algorithm
 {
     std::string name;
@@ -111,8 +158,9 @@
 }
 
 
-
-int report_library(int type, algorithm const& algo, bool clockwise,
+template <typename CompilePolicy>
+int report_library(CompilePolicy& compile_policy,
+                   int type, algorithm const& algo, bool clockwise,
                    bool open, int dimensions, std::string const& cs,
                    int type2 = -1)
 {
@@ -188,19 +236,19 @@
             ;
     }
 
-    int failed = system("bjam -a tmp > tmp/t.out");
-    if (failed)
+    bool result = compile_policy.apply(type, type2);
+    if (! result)
     {
         std::cout << " ERROR";
     }
-
     std::cout << std::endl;
-
-    return !failed;
+    return result;
 }
 
 
-std::vector<int> report(int type, algorithm const& algo, bool clockwise,
+template <typename CompilePolicy>
+std::vector<int> report(CompilePolicy& compile_policy,
+                        int type, algorithm const& algo, bool clockwise,
                         bool open, int dimensions, std::string const& cs)
 {
     std::vector<int> result;
@@ -208,12 +256,12 @@
     switch(algo.arity)
     {
         case 1 :
-            result.push_back(report_library(type, algo, clockwise, open, dimensions, cs));
+            result.push_back(report_library(compile_policy, type, algo, clockwise, open, dimensions, cs));
             break;
         case 2 :
             for (int type2 = point; type2 < geometry_count; ++type2)
             {
-                result.push_back(report_library(type, algo, clockwise, open, dimensions, cs, type2));
+                result.push_back(report_library(compile_policy, type, algo, clockwise, open, dimensions, cs, type2));
             }
             break;
     }
@@ -234,14 +282,22 @@
 
 int main(int argc, char** argv)
 {
+#if defined(_MSC_VER)
+    compile_msvc compile_policy;
+#else
+    compile_bjam compile_policy;
+#endif
+
+
     typedef std::vector<algorithm> v_a_type;
     v_a_type algorithms;
     algorithms.push_back(algorithm("area"));
     algorithms.push_back(algorithm("length"));
-    //algorithms.push_back(algorithm("perimeter"));
-    //algorithms.push_back(algorithm("correct"));
+    algorithms.push_back(algorithm("perimeter"));
+    algorithms.push_back(algorithm("correct"));
     algorithms.push_back(algorithm("distance", 2));
-    //algorithms.push_back(algorithm("centroid", 2));
+    algorithms.push_back(algorithm("centroid", 2));
+    //algorithms.push_back(algorithm("within", 2));
 
     typedef std::vector<cs> cs_type;
     cs_type css;
@@ -249,6 +305,9 @@
     // css.push_back(cs("spherical<bg::degree>"));
     // css.push_back(cs("spherical<bg::radian>"));
 
+
+    boost::timer timer;
+
     for (v_a_type::const_iterator it = algorithms.begin(); it != algorithms.end(); ++it)
     {
 /*([heading Behavior]
@@ -275,7 +334,7 @@
 
             for (int type = point; type < geometry_count; type++)
             {
-                table.push_back(report(type, *it, true, true, 2, cit->name));
+                table.push_back(report(compile_policy, type, *it, true, true, 2, cit->name));
             }
 
 
@@ -304,7 +363,7 @@
                 for (int type = point; type < geometry_count; type++)
                 {
                     if (!columns_status[type]) continue;
-                    out << "[[" << geometry_string(type) << "]]";
+                    out << "[" << geometry_string(type) << "]";
                 }
             }
             else
@@ -317,18 +376,21 @@
             for (unsigned int i = 0; i != table.size(); ++i)
             {
                 if (!lines_status[i]) continue;
-                out << "[[" << geometry_string(i) << "]]";
+                out << "[";
+                out << "[" << geometry_string(i) << "]";
                 for (unsigned int j = 0; j != table[i].size(); ++j)
                 {
                     if (!columns_status[j]) continue;
                     out << "[[$img/" << (table[i][j] ? "ok" : "nyi") << ".png]]";
                 }
-                out << std::endl;
+                out << "]" << std::endl;
             }
 
             out << "]" << std::endl;
         }
     }
 
+    std::cout << "TIME: " << timer.elapsed() << std::endl;
+
     return 0;
 }