aboutsummaryrefslogtreecommitdiff
path: root/CruUI/builder.h
blob: 3ae8724e967b4b5ce85148802fd3058daab0ade7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#pragma once

#include "base.h"

namespace cru
{
    template<typename T>
    class OneTimeBuilder : public Object
    {
    protected:
        OneTimeBuilder() = default;

    public:
        OneTimeBuilder(const OneTimeBuilder& other) = delete;
        OneTimeBuilder(OneTimeBuilder&& other) = delete;
        OneTimeBuilder& operator=(const OneTimeBuilder& other) = delete;
        OneTimeBuilder& operator=(OneTimeBuilder&& other) = delete;
        virtual ~OneTimeBuilder() = default;

        T* Create()
        {
            if (is_valid_)
            {
                is_valid_ = false;
                return OnCreate();
            }
            else
                throw std::runtime_error("OneTimeBuilder is invalid.");
        }

        bool IsValid() const
        {
            return is_valid_;
        }

    protected:
        virtual T* OnCreate() = 0;

    private:
        bool is_valid_ = true;
    };
}