aboutsummaryrefslogtreecommitdiff
path: root/src/base.cpp
blob: 57a4848e56d5f41285bd5104e8a5e88f2f1b429b (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
#include "base.h"

#include "system_headers.h"
#include "exception.h"

namespace cru
{
    MultiByteString ToUtf8String(const StringView& string)
    {
        if (string.empty())
            return MultiByteString();

        const auto length = ::WideCharToMultiByte(CP_UTF8, 0, string.data(), -1, nullptr, 0, nullptr, nullptr);
        MultiByteString result;
        result.reserve(length);
        if (::WideCharToMultiByte(CP_UTF8, 0, string.data(), -1, result.data(), static_cast<int>(result.capacity()), nullptr, nullptr) == 0)
            throw Win32Error(::GetLastError(), "Failed to convert wide string to UTF-8.");
        return result;
    }

    void PropertyChangedNotifyObject::AddPropertyChangedListener(FunctionPtr<void(String)> listener)
    {
        listeners_.push_back(std::move(listener));
    }

    void PropertyChangedNotifyObject::RemovePropertyChangedListener(const FunctionPtr<void(String)>& listener)
    {
        for (auto i = listeners_.cbegin(); i != listeners_.cend(); ++i)
            if (*i == listener)
            {
                listeners_.erase(i);
                break;
            }
    }

    void PropertyChangedNotifyObject::RaisePropertyChangedEvent(String property_name)
    {
        for (const auto& listener : listeners_)
            (*listener)(property_name);
    }
}