From: S R. <kiw...@ma...> - 2009-10-26 13:21:03
|
On Oct 26, 2009, at 09:10 , Konstantin Litvinenko wrote: > On 26.10.2009 14:49, S Roderick wrote: >>> 1. Create RT Category class. >> >> This is what we've done, but I doubt that you want an Orocos-specific > class inside log4cpp? >> > > :) Yes, we don't need that in log4cpp core. > >>> 2. Instruct somehow log4cpp to create RTCategory in > HierarchyMaintainer . >> >> Yes! This is what I'm trying to figure out the best way to do it. It >> would be nice to come up with a general method to do this for any >> derived Category class, so that other projects can add functionality >> that they might need. This led me to thoughts of a factory class to >> create Category objects, or some way to override the default >> HierarchyMaintainer instance at runtime. > > Ok. Than lets consider possible ways to do this. > Main usage patter I use is: > > #include <log4cpp/Category.hh> > > static log4cpp::Category& logger = > log4cpp::Category::getInstance("foo.bar"); Agreed. > So, if we add to HierarchyMaintainer additional methods: > > void set_category_factory(creator_function_t creator_function) { > creator_function_ = creator_function; } > std::auto_ptr<Category> make_category() { return creator_function(); } > > to setup and use some factory, we wan't be able use RTCategory in > above > use-case, except if we modify Category::getInstance to allow this: > > static log4cpp::Category& logger = > log4cpp::Category::getInstance("foo.bar", "RTCategory"); > > where second parameter will be category type name, and > HierarchyMaintainer will create specific Category object based on > that name. > > If usage pattern do not involve static module initialization logic > than > proposed extension will allow users to have their own specific > Category > objects. That is one option. Another option might be static HierarchyMaintainer* _defaultMaintainer=0; HierarchyMaintainer& HierarchyMaintainer::getDefaultMaintainer() { static HierarchyMaintainer defaultMaintainer; // use default maintainer if it is not already set if (! _defaultMaintainer) _defaultMaintainer = & defaultMaintainer; return *_defaultMaintainer; } void HierarchyMaintainer::setDefaultMaintainer (HierarchyMaintainer* d) { _defaultMaintainer = d; } This allows the application to override the default maintainer programmatically. Or is this a kind of "static module initialization logic" that you are trying to avoid? Stephen |