Skip to content
Snippets Groups Projects
This project is mirrored from https://git.alchemyviewer.org/alchemy/alchemy-next.git. Pull mirroring failed .
Repository mirroring has been paused due to too many failed attempts. It can be resumed by a project maintainer or owner.
  1. Jun 22, 2022
    • Nat Goodspeed's avatar
      DRTVWR-564: Allow LLLeapListener to report LazyEventAPIs too. · 6b53036f
      Nat Goodspeed authored
      One important factor in the design of LazyEventAPI was the desire to allow
      LLLeapListener to query metadata for an LLEventAPI even if it hasn't yet been
      instantiated by LazyEventAPI. That's why LazyEventAPI requires the same
      metadata required by a classic LLEventAPI.
      
      Instead of just publicly exposing its data members, give LazyEventAPI a query
      API mimicking LLEventAPI / LLEventDispatcher. Protect data members and private
      methods.
      
      Adapt lazyeventapi_test.cpp accordingly.
      
      Extend LLLeapListener::getAPIs() and getAPI() to look through LazyEventAPIBase
      instances after first checking existing LLEventAPI instances. Because the
      query API for LazyEventAPIBase mimics LLEventAPI's, extract getAPI()'s actual
      metadata reporting to a new internal template function reportAPI().
      
      While we're touching LLLeapListener, we no longer need BOOST_FOREACH().
      6b53036f
  2. Jun 18, 2022
    • Nat Goodspeed's avatar
      DRTVWR-564: WIP: Add LazyEventAPI and tests. Tests don't yet pass. · af4fbc1f
      Nat Goodspeed authored
      LazyEventAPI is a registrar that implicitly instantiates some particular
      LLEventAPI subclass on demand: that is, when LLEventPumps::obtain() tries to
      find an LLEventPump by the registered name.
      
      This leverages the new LLEventPumps::registerPumpFactory() machinery. Fix
      registerPumpFactory() to adapt the passed PumpFactory to accept TypeFactory
      parameters (two of which it ignores). Supplement it with
      unregisterPumpFactory() to support LazyEventAPI instances with lifespans
      shorter than the process -- which may be mostly test programs, but still a
      hole worth closing. Similarly, add unregisterTypeFactory().
      
      A LazyEventAPI subclass takes over responsibility for specifying the
      LLEventAPI's name, desc, field, plus whatever add() calls will be needed to
      register the LLEventAPI's operations. This is so we can (later) enhance
      LLLeapListener to consult LazyEventAPI instances for not-yet-instantiated
      LLEventAPI metadata, as well as enumerating existing LLEventAPI instances.
      
      The trickiest part of this is capturing calls to the various
      LLEventDispatcher::add() overloads in such a way that, when the LLEventAPI
      subclass is eventually instantiated, we can replay them in the new instance.
      
      LLEventAPI acquires a new protected constructor specifically for use by a
      subclass registered by a companion LazyEventAPI. It accepts a const reference
      to LazyEventAPIParams, intended to be opaque to the LLEventAPI subclass; the
      subclass must declare a constructor that accepts and forwards the parameter
      block to the new LLEventAPI constructor. The implementation delegates to the
      existing LLEventAPI constructor, plus it runs deferred add() calls.
      
      LLDispatchListener now derives from LLEventStream instead of containing it as
      a data member. The reason is that if LLEventPumps::obtain() implicitly
      instantiates it, LLEventPumps's destructor will try to destroy it by deleting
      the LLEventPump*. If the LLEventPump returned by the factory function is a
      data member of an outer class, that won't work so well. But if
      LLDispatchListener (and by implication, LLEventAPI and any subclass) is
      derived from LLEventPump, then the virtual destructor will Do The Right Thing.
      
      Change LLDispatchListener to *not* allow tweaking the LLEventPump name. Since
      the overwhelming use case for LLDispatchListener is LLEventAPI, accepting but
      silently renaming an LLEventAPI subclass would ensure nobody could reach it.
      
      Change LLEventDispatcher's use of std::enable_if to control the set of add()
      overloads available for the intended use cases. Apparently this formulation is
      just as functional at the method declaration point, while avoiding the need to
      restate the whole enable_if expression at the method definition point.
      
      Add lazyeventapi_test.cpp to exercise.
      af4fbc1f
Loading