blob: 6abce971882ed5d0bd07b40a132e69f5f5e43cf6 [file] [log] [blame]
// 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: csilvers@google.com (Craig Silverstein)
//
// In addition to a TemplateDictionary, there is also a PerExpandData
// dictionary. This dictionary holds information that applies to one
// call to Expand, such as whether to annotate the template expansion
// output. A template dictionary is associated with a template (.tpl)
// file; a per-expand dictionary is associated to a particular call to
// Expand() in a .cc file.
//
// For (many) more details, see the doc/ directory.
#ifndef TEMPLATE_PER_EXPAND_DATA_H_
#define TEMPLATE_PER_EXPAND_DATA_H_
#include <stdlib.h> // for NULL
#include <string.h> // for strcmp
#include <sys/types.h>
#include <hash_map>
#include <ctemplate/template_string.h> // for StringHash
// 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 {
class TemplateModifier;
class TemplateAnnotator;
class CTEMPLATE_DLL_DECL PerExpandData {
public:
PerExpandData()
: annotate_path_(NULL),
annotator_(NULL),
expand_modifier_(NULL),
map_(NULL) { }
~PerExpandData();
// Indicate that annotations should be inserted during template expansion.
// template_path_start - the start of a template path. When
// printing the filename for template-includes, anything before and
// including template_path_start is elided. This can make the
// output less dependent on filesystem location for template files.
void SetAnnotateOutput(const char* template_path_start) {
annotate_path_ = template_path_start;
}
// Whether to annotate the expanded output.
bool annotate() const { return annotate_path_ != NULL; }
// The annotate-path; undefined if annotate() != true
const char* annotate_path() const { return annotate_path_; }
// This sets the TemplateAnnotator to be used when annotating is on.
// This allows you to override the default text-based annotator
// that will be used if you do not call this. The passed annotator
// will be aliased by this object and returned by annotator().
// Passing NULL has the special behavior of causing annotator() to
// revert to returning its built-in instance.
void SetAnnotator(TemplateAnnotator* annotator) {
annotator_ = annotator;
}
// This returns the TemplateAnnotator to be used when annotating is on.
// The value returned will be either an instance previously provided
// to SetAnnotator() or the callable built-in text-based annotator.
TemplateAnnotator* annotator() const;
// This is a TemplateModifier to be applied to all templates
// expanded via this call to Expand(). That is, this modifier is
// applies to the template (.tpl) file we expand, as well as
// sub-templates that are expanded due to {{>INCLUDE}} directives.
// Caller is responsible for ensuring that modifier exists for the
// lifetime of this object.
void SetTemplateExpansionModifier(const TemplateModifier* modifier) {
expand_modifier_ = modifier;
}
const TemplateModifier* template_expansion_modifier() const {
return expand_modifier_;
}
// Store data in this structure, to be used by template modifiers
// (see template_modifiers.h). Call with value set to NULL to clear
// any value previously set. Caller is responsible for ensuring key
// and value point to valid data for the lifetime of this object.
void InsertForModifiers(const char* key, const void* value);
// Retrieve data specific to this Expand call. Returns NULL if key
// is not found. This should only be used by template modifiers.
const void* LookupForModifiers(const char* key) const;
// Same as Lookup, but casts the result to a c string.
const char* LookupForModifiersAsString(const char* key) const {
return static_cast<const char*>(LookupForModifiers(key));
}
private:
#ifdef _MSC_VER
typedef stdext::hash_map<const char*, const void*, StringHash> DataMap;
#else
struct DataEq {
bool operator()(const char* s1, const char* s2) const;
};
typedef stdext::hash_map<const char*, const void*, StringHash, DataEq>
DataMap;
#endif
const char* annotate_path_;
TemplateAnnotator* annotator_;
const TemplateModifier* expand_modifier_;
DataMap* map_;
PerExpandData(const PerExpandData&); // disallow evil copy constructor
void operator=(const PerExpandData&); // disallow evil operator=
};
}
#endif // TEMPLATE_PER_EXPAND_DATA_H_