Squashed 'third_party/ctemplate/' content from commit 6742f62

Change-Id: I828e4e4c906f13ba19944d78a8a78652b62949af
git-subtree-dir: third_party/ctemplate
git-subtree-split: 6742f6233db12f545e90baa8f34f5c29c4eb396a
diff --git a/src/windows/ctemplate/template_dictionary_interface.h b/src/windows/ctemplate/template_dictionary_interface.h
new file mode 100644
index 0000000..03bae41
--- /dev/null
+++ b/src/windows/ctemplate/template_dictionary_interface.h
@@ -0,0 +1,149 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ---
+// Author: williasr@google.com (Scott Williams)
+//
+// This file implements the TemplateDictionaryInterface class. This interface
+// forms the root of the TemplateDictionary class tree, but the interface is
+// minimal enough to allow other sources of template data. Note that the
+// TemplateDictionaryInterface class enumerates the properties expected by
+// Template: it doesn't constrain how data gets into the
+// TemplateDictionaryInterface class to begin with. For these methods, see
+// TemplateDictionary.
+//
+
+#ifndef TEMPLATE_TEMPLATE_DICTIONARY_INTERFACE_H_
+#define TEMPLATE_TEMPLATE_DICTIONARY_INTERFACE_H_
+
+#include <stdlib.h>
+#include <string>
+#include <ctemplate/template_string.h>
+
+// NOTE: if you are statically linking the template library into your binary
+// (rather than using the template .dll), set '/D CTEMPLATE_DLL_DECL='
+// as a compiler flag in your project file to turn off the dllimports.
+#ifndef CTEMPLATE_DLL_DECL
+# define CTEMPLATE_DLL_DECL  __declspec(dllimport)
+#endif
+
+namespace ctemplate {
+
+const int kIndent = 2;  // num spaces to indent each level -- used with dump
+
+// TemplateDictionaryInterface
+// The template data contains the associated values for
+// variables, the hidden/visible state for sections and included
+// templates, the associated set of dictionaries for sections and
+// included templates, and the template filenames to be expanded in
+// place of template-include nodes.
+class CTEMPLATE_DLL_DECL TemplateDictionaryInterface {
+ public:
+  // TemplateDictionaryInterface destructor
+  virtual ~TemplateDictionaryInterface() {}
+
+ protected:
+  // The interface as follows is used at expand-time by Expand.
+  friend class VariableTemplateNode;
+  friend class SectionTemplateNode;
+  friend class TemplateTemplateNode;
+  // This class reaches into our internals for testing.
+  friend class TemplateDictionaryPeer;
+  friend class TemplateDictionaryPeerIterator;
+
+  // GetSectionValue
+  //   Returns the value of a variable.
+  virtual TemplateString GetValue(const TemplateString& variable) const = 0;
+
+  // IsHiddenSection
+  //   A predicate to indicate the current hidden/visible state of a section
+  //   whose name is passed to it.
+  virtual bool IsHiddenSection(const TemplateString& name) const = 0;
+
+  // Dump a string representation of this dictionary to the supplied string.
+  virtual void DumpToString(std::string* out, int level) const = 0;
+
+  // TemplateDictionaryInterface is an abstract class, so its constructor is
+  // only visible to its subclasses.
+  TemplateDictionaryInterface() {}
+
+  class Iterator {
+   protected:
+    Iterator() { }
+   public:
+    virtual ~Iterator() { }
+
+    // Returns false if the iterator is exhausted.
+    virtual bool HasNext() const = 0;
+
+    // Returns the current referent and increments the iterator to the next.
+    virtual const TemplateDictionaryInterface& Next() = 0;
+  };
+
+  // IsHiddenTemplate
+  //   Returns true if the template include is hidden. This is analogous to
+  //   IsHiddenSection, but for template nodes.
+  virtual bool IsHiddenTemplate(const TemplateString& name) const = 0;
+
+  // GetIncludeTemplateName
+  //   Returns the name of the template associated with the given template
+  //   include variable. If more than one dictionary is attached to the include
+  //   symbol, dictnum can be used to disambiguate which include name you mean.
+  virtual const char* GetIncludeTemplateName(
+      const TemplateString& variable, int dictnum) const = 0;
+
+  // CreateTemplateIterator
+  //   A factory method for constructing an iterator representing the
+  //   subdictionaries of the given include node.  The caller is
+  //   responsible for deleting the return value when it's done with it.
+  virtual Iterator* CreateTemplateIterator(
+      const TemplateString& section) const = 0;
+
+  // CreateSectionIterator
+  //   A factory method for constructing an iterator representing the
+  //   subdictionaries of the given section node.  The caller is
+  //   responsible for deleting the return value when it's done with it.
+  virtual Iterator* CreateSectionIterator(
+      const TemplateString& section) const = 0;
+
+  // IsUnhiddenSection
+  //   Returns true if the section has been marked visible and false otherwise.
+  virtual bool IsUnhiddenSection(
+      const TemplateString& name) const = 0;
+
+ private:
+  // Disallow copy and assign.
+  TemplateDictionaryInterface(const TemplateDictionaryInterface&);
+  void operator=(const TemplateDictionaryInterface&);
+};
+
+}
+
+
+#endif  // TEMPLATE_TEMPLATE_DICTIONARY_INTERFACE_H_