Thrift: Local Reflection for C++.

Summary:
The compiler now takes a "-dense" flag that will cause it to
generate some extra metadata for C++.  This metadata will be used by
TDenseProtocol.  This should be the last compiler change necessary
to enable that feature.

Reviewed By: mcslee

Test Plan: test/DenseLinkingTest.thrift

Revert Plan: ok


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665240 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc
index e46fcea..e0ff21f 100644
--- a/compiler/cpp/src/main.cc
+++ b/compiler/cpp/src/main.cc
@@ -142,6 +142,7 @@
 bool gen_ocaml = false;
 bool gen_erl = false;
 bool gen_hs = false;
+bool gen_dense = false;
 bool gen_recurse = false;
 
 /**
@@ -525,6 +526,13 @@
     st->generate_fingerprint();
   }
 
+  const vector<t_struct*>& xceptions = program->get_xceptions();
+  vector<t_struct*>::const_iterator x_iter;
+  for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
+    t_struct* st = *x_iter;
+    st->generate_fingerprint();
+  }
+
   // If you want to generate fingerprints for implicit structures, start here.
   /*
   const vector<t_service*>& services = program->get_services();
@@ -553,8 +561,10 @@
   fprintf(stderr, "  -ocaml      Generate OCaml output files\n");
   fprintf(stderr, "  -erl        Generate Erlang output files\n");
   fprintf(stderr, "  -hs         Generate Haskell output files\n");
-  fprintf(stderr, "  -I dir      Add a directory to the list of directories \n");
+  fprintf(stderr, "  -I dir      Add a directory to the list of directories\n");
   fprintf(stderr, "                searched for include directives\n");
+  fprintf(stderr, "  -dense      Generate metadata for TDenseProtocol (C++)\n");
+  fprintf(stderr, "  -rest       Generate PHP REST processors (with -php)\n");
   fprintf(stderr, "  -nowarn     Suppress all compiler warnings (BAD!)\n");
   fprintf(stderr, "  -strict     Strict compiler warnings on\n");
   fprintf(stderr, "  -v[erbose]  Verbose mode\n");
@@ -768,7 +778,7 @@
 
     if (gen_cpp) {
       pverbose("Generating C++\n");
-      t_cpp_generator* cpp = new t_cpp_generator(program);
+      t_cpp_generator* cpp = new t_cpp_generator(program, gen_dense);
       cpp->generate_program();
       delete cpp;
     }
@@ -898,6 +908,8 @@
         g_verbose = 1;
       } else if (strcmp(arg, "-r") == 0 || strcmp(arg, "-recurse") == 0 ) {
         gen_recurse = true;
+      } else if (strcmp(arg, "-dense") == 0) {
+        gen_dense = true;
       } else if (strcmp(arg, "-cpp") == 0) {
         gen_cpp = true;
       } else if (strcmp(arg, "-javabean") == 0) {