//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once

#include "td/utils/common.h"

namespace td {

class ObserverBase {
 public:
  ObserverBase() = default;
  ObserverBase(const ObserverBase &) = delete;
  ObserverBase &operator=(const ObserverBase &) = delete;
  ObserverBase(ObserverBase &&) = delete;
  ObserverBase &operator=(ObserverBase &&) = delete;
  virtual ~ObserverBase() = default;

  virtual void notify() = 0;
};

class Observer final : private ObserverBase {
 public:
  Observer() = default;
  explicit Observer(unique_ptr<ObserverBase> &&ptr) : observer_ptr_(std::move(ptr)) {
  }

  void notify() final {
    if (observer_ptr_) {
      observer_ptr_->notify();
    }
  }

 private:
  unique_ptr<ObserverBase> observer_ptr_;
};

}  // namespace td