[Insight-developers] Explicit Instantiation Proposal

Zachary Pincus zpincus at stanford.edu
Wed Apr 26 15:27:43 EDT 2006


> What's wrong with defining ITK_MANUAL_INSTANTIATION at the top of  
> the wrapper config files?

Now that the "code organization" section is up, I see that this will  
remain possible. I was just asking if that was in fact the case. One  
aside: right now setting ITK_MANUAL_INSTANTIATION (just for gcc-xml)  
causes the wrappers to explode badly because of something in  
itkVector.h and its use of the new template macros.

>> The bottom of any header could then look thus:
>> #ifdef EXPLICIT_INSTANCES
>> #include itkFooInstances.h // auto-generated by CMake
>> // (or #include itkCommonInstances.h if the omnibus approach was  
>> taken)
>> #endif
>> #include itkFoo.txx
>> And then to make the instantiations for ITKCommon, just compile  
>> the  one or multiple cxx files (ITKCommonInstances.cxx or   
>> itkFooInstances.cxx/itkBarInstances.cxx/itk...) that CMake has   
>> generated.
>
> Read the section of the Wiki page about Organizing Source Files to  
> see why there has to be one instantiation per object file.

OK.

As to below, what I was doing was making the case for putting more of  
the logic in CMake and less of the logic in preprocessor macros  
because I find the former to be more maintainable than the latter. It  
was just a thought.

>> Advantages of this approach:
>>   (1) Finer-grained control of what gets instantiated, and how
>
> How is this finer-grained?

Because it allows tighter interaction between what the user might  
select to instantiate in CMake with the actual process of creating  
the instantiations. Doing this all via preprocessor symbols could get  
ugly quickly. Doing it via explicit logic in cmake (which is what the  
WrapITK wrappers do) gave us a lot of flexibility that we have made  
good use of.

>
>>   (2) Less tricky macros
>
> Possibly, but the information about what to instantiate for a given  
> template has to be encoded somewhere.

Right. But (a) preprocessor macros are a lot more unwieldy than CMake  
macors and thus lead to a lot of the ugliness that the wiki page is  
devoted to exposing and then hiding in yet-more preprocessor macros,  
and (b) encoding it explicitly in a separate file that CMake can  
parse would allow a lot of other add-on uses for the definitions like  
e.g. code generators for a GUI toolkit that wants to know what sort  
of inputs a filter takes without having to parse horrific C++/ 
preprocessor macro/etc. Or e.g. things like WrapITK.
It's the old argument for separating declarative information (what  
kinds of templates a filter takes) from procedural information (how  
to create explicit instances).

>
>>   (3) Explicit metadata about how filters should be instantiated  
>> is  provided, which is useful for other things like wrappers.
>
> The instantiation names created by the macros should match the  
> wrapper names exactly.

Not sure I follow your point here... see above about how having  
declarative information about the filters (i.e. "metadata") in cmake  
files is a generally useful thing.

>
>>   (4) A glance at the list of filters with corresponding cmake   
>> metadata files indicates which ones have been so described.
>
> This will be true if we use CMake to generate the instantiation  
> sources no matter how they are implemented.
>
>>   (5) The CMake macros for declaring how a filter is to be   
>> instantiated are far easier than the preprocessor macros, because  
>> the  latter is more powerful than the former.
>
> The macro-based instantiation design complements a CMake-based  
> instantiation generator.
>
> Generating instantiations with CMake has been the idea all along.

Then why spend all of this time developing fairly hairy preprocessor  
macros, and then having those macros controlled by symbols that CMake  
may define to select which instances to instantiate, when you could  
do the logic more cleanly within CMake, and have CMake write out  
exactly the instantiation files and headers you need at configure time?


> Encoding the declarations used in the instantiation of a particular  
> template in a macro inside the header file keeps everything about  
> the template in one place.

It also keeps that very useful information inaccessible except in the  
narrow context of explicit template instantiation, when it could  
instead be a general resource for people who want to do complex stuff  
with the ITK filters. This and this alone is my main point: by  
building an ever-so-slightly more generic system for representing  
information about templates, and then using that system to make the  
template instantiations, you have also built a system that other  
people can use for other really useful things.


>   Then the input to the instantiation generator need only concern  
> itself with the template arguments and instantiation names.  If  
> something is added to a template that requires more instantiation  
> lines only the macro needs to be changed instead of a bunch of  
> CMake files that may not even be in the same CVS repository.

The bit about being in another CVS is something of a straw man.  
Otherwise, I agree that having information in two separate files is  
more of a pain than having it in one. In the context of a global  
reduction in C-preprocessor pain, and in pain for outside folk who  
could make use of some explicit and easily-parsed information about  
what sort of template parameters a given class expects, it might  
still be a win...

>
> As far as wrapper integration, a wrapper config file could now look  
> something like
>
> // wrap_itkVector.cxx
> #define ITK_MANUAL_INSTANTIATION
> #include "Templates/itkVectorF2.h"
> #include "Templates/itkVectorF3.h"
> #include "Templates/itkVectorD2.h"
> #include "Templates/itkVectorD3.h"

Shouldn't the instantiation headers just be pulled in automatically  
as part of the vector header? Otherwise keeping all of that stuff in  
sync will be a huge pain.


Anyhow, I'm not trying to be combative or anything. I just wanted to  
point out that this could be a nice opportunity to build a general  
system for describing the ITK templates. And that using such a  
general system to then drive the explicit instantiation (as well as  
wrapping, or other nice things) could accrue several advantages over  
doing it all within the preprocessor.

I'd be happy to talk at more length about this if anyone is  
interested, otherwise I'll keep quiet and let you folk go about your  
work.

Zach



More information about the Insight-developers mailing list