The benefits of reading CUJ
When I subscribed to CUJ two years ago, I also bought its Release 4 CD-ROM so that I could have access to past issues. This has turned out to be a time saver on this project because, as mentioned in the section on "Multivalued logic", I was able to find and use Art Walker's enum++, with some minor enhancements (see references).
Another very useful class that I incorporated into my program is Maurice Fox's Debug class (see references). It is a general purpose trace, debug, and timing class, which allows me to view the calling tree of functions with the outputs I specify.
I was able to extend it for my purposes, for example, to show a sample hierarchical trace:
* => backtraceGraph 1: vertex label== = U3:nand ...
** => discover_vertex 1: vertex label== = U3:nand ...
** => discover_vertex 1: vertex label== = U2:nand ...
** => discover_vertex 1: vertex label== = J:in ...
** => discover_vertex 1: vertex label== = K:in ...
** => discover_vertex 1: vertex label== = M:in ...
* => implicateVertex 1: vertex label== = J:in ...
** => setAllVertexOutputs 1: vertex label== = J:in ...
** => discover_vertex 1: vertex label== = J:in ...
** => discover_vertex 1: vertex label== = U2:nand ...
This Debug class can be compiled away with a DEBUG_OFF define, although as Maurice Fox says in his article, "Usually you're just kidding yourself when you do that, though". In fact, the performance overhead in several projects in which I have used Debug are typically less than 1%, so I tend to agree with Maurice and leave the class compiled in.
Another tool that comes in handy is Leor Zolman's STL Decryptor ( see references ).
Similarly, when you look at the code, you'll see how I manage namespaces by following Herb Sutter's "Migrating to Namespaces" ( see references ) recommendations.