diff options
Diffstat (limited to 'ceee/common/initializing_coclass.py')
-rw-r--r-- | ceee/common/initializing_coclass.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/ceee/common/initializing_coclass.py b/ceee/common/initializing_coclass.py new file mode 100644 index 0000000..f756fd0 --- /dev/null +++ b/ceee/common/initializing_coclass.py @@ -0,0 +1,107 @@ +# Copyright (c) 2010 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""A generator for initializing_coclass.h, which contains a bunch of +repeated code that can't be produced through the preprocessor.""" + +import sys +from string import Template + +HEADER_ = """\ +// This file is autogenerated by initializing_coclass.py, do not edit. +#ifndef CEEE_COMMON_INITIALIZING_COCLASS_GEN_INL_ +#define CEEE_COMMON_INITIALIZING_COCLASS_GEN_INL_ + +""" + +FOOTER_ = """\ +#endif // CEEE_COMMON_INITIALIZING_COCLASS_GEN_INL_ +""" + +# This template is used to generate a pair of template functions for N +# initialization parameters. +TEMPLATE_ = Template('''\ + // Creates a new instance of ImplClass + // @returns S_OK on success, an appropriate error on failure. + // @param new_instance on success returns the newly created and initialized + // ImplClass instance. + // @note *new_instance has zero references, and as result the use of this + // function is highly discouraged as the existence of *new_instance + // on return of this function is quite brittle. + template <${templ_params}> + static HRESULT CreateInstance(${params}, T** new_instance) { + TImpl* instance; + HRESULT hr = TImpl::CreateInstance(&instance); + if (FAILED(hr)) + return hr; + + instance->InternalFinalConstructAddRef(); + hr = instance->Initialize(${args}); + instance->InternalFinalConstructRelease(); + if (FAILED(hr)) { + delete instance; + instance = NULL; + } + *new_instance = instance; + + return hr; + } + + template <class I, ${templ_params}> + static HRESULT CreateInitialized(${params}, I** instance) { + T* new_instance; + HRESULT hr = CreateInstance(${args}, &new_instance); + if (FAILED(hr)) + return hr; + + hr = new_instance->QueryInterface(__uuidof(I), + reinterpret_cast<void**>(instance)); + if (FAILED(hr)) + delete new_instance; + + return hr; + } + + template <class I, ${templ_params}> + static HRESULT CreateInitializedIID(${params}, REFIID iid, I** instance) { + T* new_instance; + HRESULT hr = CreateInstance(${args}, &new_instance); + if (FAILED(hr)) + return hr; + + hr = new_instance->QueryInterface(iid, reinterpret_cast<void**>(instance)); + if (FAILED(hr)) + delete new_instance; + + return hr; + } + +''') + + +def Emit(outfile, templ, num_args): + """Emits a template function for num_args arguments""" + mapping = { + 'templ_params': + ", ".join(["class A%d" % d for d in xrange(1, num_args + 1)]), + 'params': + ", ".join(["const A%d &a%d" % (d, d) for d in xrange(1, num_args + 1)]), + 'args': ", ".join(["a%d" % d for d in xrange(1, num_args + 1)]), + } + outfile.write(templ.substitute(mapping)) + + +NUM_ARGUMENTS = 10 + + +def Main(outfile): + """Emits the contents of initializing_coclass-inl.h.""" + outfile.write(HEADER_) + # do one to NUM_ARGUMENTS arguments + for num_args in xrange(1, 1 + NUM_ARGUMENTS): + Emit(outfile, TEMPLATE_, num_args) + outfile.write(FOOTER_) + +if (__name__ == "__main__"): + outfile = open(sys.argv[1], 'w') + Main(outfile) |