Does this seem like a good wrapper class for continuations in the C++ API?

class Continuation
{
public:
  Continuation(TSMutex mutexp = TSMutexCreate()) :
_cont(TSContCreate(_generalEventFunc, mutexp))
  {
    TSContDataSet(_cont, static_cast<void *>(this));
  }

  TSCont
  asTSCont() const
  {
    return _cont;
  }

  void
  destroy()
  {
    if (_cont) {
      TSContDestroy(_cont);
      _cont = nullptr;
    }
  }

  ~Continuation()
  {
    if (_cont) {
      TSContDestroy(_cont);
    }
  }

  // No copying.
  Continuation(const Continuation &) = delete;
  Continuation &operator=(const Continuation &) = delete;

  // Moving allowed.
  Continuation(Continuation &&that)
  {
    _cont      = that._cont;
    that._cont = nullptr;
  }
  Continuation &
  operator=(Continuation &&that)
  {
    if (&that != this) {
      if (_cont) {
        TSContDestroy(_cont);
      }
      _cont      = that._cont;
      that._cont = nullptr;
    }
    return *this;
  }

  explicit operator bool() const { return _cont != nullptr; }

private:
  // Distinct continuation behavior is achieved by overriding this
function in a derived continuation type.
  //
  virtual int _run(TSEvent event, void *edata) = 0;

  // This is the event function for all continuations in C++ plugins.
  //
  static int _generalEventFunc(TSCont cont, TSEvent event, void *edata);

  TSCont _cont;
};

Reply via email to