Boost logo

Boost :

From: Rob Stewart (stewart_at_[hidden])
Date: 2002-08-30 12:08:26


From: Carlo Wood <carlo_at_[hidden]>
> On Fri, Aug 30, 2002 at 12:00:58PM -0400, Rob Stewart wrote:
> > From: Douglas Gregor <gregod_at_[hidden]>
> > > On Friday 30 August 2002 11:12 am, Carlo Wood wrote:
> > > template<typename InputIterator, typename Allocator, typename OutputIterator>
> > > OutputIterator demangle_type(InputIterator first, InputIterator last,
> > > const Allocator& allocator, OutputIterator out);
> >
> > I consider this approach inspired. I would eliminate the
> > Allocator parameter, as I don't really think the library needs it
>
> However, the Allocator is needed as I will need to store
> things internally (substitutions, template parameter lists).

Let me see if I understand the problem you're dealing with.
Because of the possibility of demangle() being called from within
a call to malloc(), you can't rely on ordinary memory allocation
routines because of the possibility of a deadlock.

That leads me to the following questions:

- Under what scenario will demangle() be invoked from within a
  call to malloc()?

- Why would the demangle() client care how demangle() manages its
  memory?

- If demangle() needs a separate memory scheme, couldn't it use
  OS-specific means for establishing a separate heap? I realize
  that implies portability issues, but it would work, wouldn't
  it?

- I don't suppose that the information demangle() needs to track
  could be preallocated, could it? (I'm gathering that you want
  to track information per symbol, so the data is unbounded.)

- Didn't you previously mention that there could be an interface
  to supply the (de)allocation functions? That's not unlike
  set_terminate(), but it leads to problems if you need
  demangle() to work before entering main(). So, why not create
  a parameterized class which can be given the required functions
  as part of specializing the type:

    template <typename Allocator, typename Deallocator>
    struct demangler
    {
        static std::string type(std::string const & type_i);
        static std::string type(std::type_info const & type_i);
        static std::string symbol(std::string const & symbol_i);
    };

  Usage then becomes:

    typedef demangler<?, ?> demangle;
    std::cout << demangle::type(mangled_type_name);
    std::cout << demangle::type(T.type_id());
    std::cout << demangle::symbol(mangled_symbol_name);

-- 
Rob Stewart                           stewart_at_[hidden]
Software Engineer                     http://www.sig.com
Susquehanna International Group, LLP  using std::disclaimer;

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk