:cpp:

#pragma once

#define MAKE_SINGLETON(ClassName)                   \
public:                                             \
  ClassName(const ClassName &) = delete;            \
  ClassName &operator=(const ClassName &) = delete; \
  ClassName(ClassName &&other) = delete;            \
  ClassName &operator=(ClassName &&) = delete;      \
  static ClassName &get() {                         \
    static ClassName instance;                      \
    return instance;                                \
  }

#define CONSTRUCT_SINGLETON(ClassName) ClassName ::get();
#define GET_SINGLETON(ClassName) ClassName ::get();