[C++] Expose FindCommand struct
diff --git a/find.cc b/find.cc
index b39f0b8..8e36778 100644
--- a/find.cc
+++ b/find.cc
@@ -34,17 +34,17 @@
 #include "strutil.h"
 #include "timeutil.h"
 
-namespace {
-
-class Cond {
+class FindCond {
  public:
-  virtual ~Cond() = default;
+  virtual ~FindCond() = default;
   virtual bool IsTrue(const string& name, unsigned char type) const = 0;
  protected:
-  Cond() = default;
+  FindCond() = default;
 };
 
-class NameCond : public Cond {
+namespace {
+
+class NameCond : public FindCond {
  public:
   explicit NameCond(const string& n)
       : name_(n) {
@@ -56,7 +56,7 @@
   string name_;
 };
 
-class TypeCond : public Cond {
+class TypeCond : public FindCond {
  public:
   explicit TypeCond(unsigned char t)
       : type_(t) {
@@ -68,21 +68,21 @@
   unsigned char type_;
 };
 
-class NotCond : public Cond {
+class NotCond : public FindCond {
  public:
-  NotCond(Cond* c)
+  NotCond(FindCond* c)
       : c_(c) {
   }
   virtual bool IsTrue(const string& name, unsigned char type) const {
     return !c_->IsTrue(name, type);
   }
  private:
-  unique_ptr<Cond> c_;
+  unique_ptr<FindCond> c_;
 };
 
-class AndCond : public Cond {
+class AndCond : public FindCond {
  public:
-  AndCond(Cond* c1, Cond* c2)
+  AndCond(FindCond* c1, FindCond* c2)
       : c1_(c1), c2_(c2) {
   }
   virtual bool IsTrue(const string& name, unsigned char type) const {
@@ -91,12 +91,12 @@
     return false;
   }
  private:
-  unique_ptr<Cond> c1_, c2_;
+  unique_ptr<FindCond> c1_, c2_;
 };
 
-class OrCond : public Cond {
+class OrCond : public FindCond {
  public:
-  OrCond(Cond* c1, Cond* c2)
+  OrCond(FindCond* c1, FindCond* c2)
       : c1_(c1), c2_(c2) {
   }
   virtual bool IsTrue(const string& name, unsigned char type) const {
@@ -105,23 +105,7 @@
     return true;
   }
  private:
-  unique_ptr<Cond> c1_, c2_;
-};
-
-struct FindCommand {
-  FindCommand()
-      : follows_symlinks(false), depth(INT_MAX) {
-  }
-  ~FindCommand() {
-  }
-
-  StringPiece chdir;
-  StringPiece testdir;
-  vector<StringPiece> finddirs;
-  bool follows_symlinks;
-  unique_ptr<Cond> print_cond;
-  unique_ptr<Cond> prune_cond;
-  int depth;
+  unique_ptr<FindCond> c1_, c2_;
 };
 
 class DirentNode {
@@ -440,18 +424,18 @@
       return true;
     }
 
-    Cond* ParseFact(StringPiece tok) {
+    FindCond* ParseFact(StringPiece tok) {
       if (tok == "-not" || tok == "\\!") {
         if (!GetNextToken(&tok) || tok.empty())
           return NULL;
-        unique_ptr<Cond> c(ParseFact(tok));
+        unique_ptr<FindCond> c(ParseFact(tok));
         if (!c.get())
           return NULL;
         return new NotCond(c.release());
       } else if (tok == "\\(") {
         if (!GetNextToken(&tok) || tok.empty())
           return NULL;
-        unique_ptr<Cond> c(ParseExpr(tok));
+        unique_ptr<FindCond> c(ParseExpr(tok));
         if (!GetNextToken(&tok) || tok != "\\)") {
           return NULL;
         }
@@ -487,8 +471,8 @@
       }
     }
 
-    Cond* ParseTerm(StringPiece tok) {
-      unique_ptr<Cond> c(ParseFact(tok));
+    FindCond* ParseTerm(StringPiece tok) {
+      unique_ptr<FindCond> c(ParseFact(tok));
       if (!c.get())
         return NULL;
       while (true) {
@@ -500,7 +484,7 @@
         }
         if (!GetNextToken(&tok) || tok.empty())
           return NULL;
-        unique_ptr<Cond> r(ParseFact(tok));
+        unique_ptr<FindCond> r(ParseFact(tok));
         if (!r.get()) {
           return NULL;
         }
@@ -508,8 +492,8 @@
       }
     }
 
-    Cond* ParseExpr(StringPiece tok) {
-      unique_ptr<Cond> c(ParseTerm(tok));
+    FindCond* ParseExpr(StringPiece tok) {
+      unique_ptr<FindCond> c(ParseTerm(tok));
       if (!c.get())
         return NULL;
       while (true) {
@@ -521,7 +505,7 @@
         }
         if (!GetNextToken(&tok) || tok.empty())
           return NULL;
-        unique_ptr<Cond> r(ParseTerm(tok));
+        unique_ptr<FindCond> r(ParseTerm(tok));
         if (!r.get()) {
           return NULL;
         }
@@ -539,7 +523,7 @@
     // <name> ::= '-name' NAME
     // <type> ::= '-type' TYPE
     // <maxdepth> ::= '-maxdepth' MAXDEPTH
-    Cond* ParseFindCond(StringPiece tok) {
+    FindCond* ParseFindCond(StringPiece tok) {
       return ParseExpr(tok);
     }
 
@@ -577,7 +561,7 @@
         } else if (tok[0] == '-' || tok == "\\(") {
           if (fc_->print_cond.get())
             return false;
-          Cond* c = ParseFindCond(tok);
+          FindCond* c = ParseFindCond(tok);
           if (!c)
             return false;
           fc_->print_cond.reset(c);
@@ -699,6 +683,10 @@
 
 }  // namespace
 
+FindCommand::FindCommand()
+    : follows_symlinks(false), depth(INT_MAX) {
+}
+
 FindEmulator* FindEmulator::Get() {
   return g_instance;
 }
diff --git a/find.h b/find.h
index 3ec1a4d..420576c 100644
--- a/find.h
+++ b/find.h
@@ -15,10 +15,29 @@
 #ifndef FIND_H_
 #define FIND_H_
 
+#include <memory>
 #include <string>
+#include <vector>
+
+#include "string_piece.h"
 
 using namespace std;
 
+class FindCond;
+
+struct FindCommand {
+  FindCommand();
+  ~FindCommand() = default;
+
+  StringPiece chdir;
+  StringPiece testdir;
+  vector<StringPiece> finddirs;
+  bool follows_symlinks;
+  unique_ptr<FindCond> print_cond;
+  unique_ptr<FindCond> prune_cond;
+  int depth;
+};
+
 class FindEmulator {
  public:
   virtual ~FindEmulator() = default;