std::shared_ptr get_or_create()

in spectator/registry.h [31:54]


  std::shared_ptr<M> get_or_create(IdPtr id, Args&&... args) {
    auto new_meter =
        std::make_shared<M>(std::move(id), std::forward<Args>(args)...);
    absl::MutexLock lock(&mutex_);
    auto it = meters_.find(new_meter->MeterId());
    if (it != meters_.end()) {
      // already exists, we need to ensure the existing type
      // matches the new meter type, otherwise we need to notify the user
      // of the error
      auto& old_meter = it->second;
      if (old_meter->GetType() != new_meter->GetType()) {
        detail::log_type_error(old_meter->GetType(), new_meter->GetType(),
                               *new_meter->MeterId());
        // this is not registered therefore no measurements
        // will be reported
        return new_meter;
      } else {
        return std::static_pointer_cast<M>(old_meter);
      }
    }

    meters_.emplace(new_meter->MeterId(), new_meter);
    return new_meter;
  }