]> git.tdb.fi Git - ext/openal.git/blob - al/eax/exception.cpp
Import OpenAL Soft 1.23.1 sources
[ext/openal.git] / al / eax / exception.cpp
1 #include "config.h"
2
3 #include "exception.h"
4
5 #include <cassert>
6 #include <string>
7
8
9 EaxException::EaxException(const char *context, const char *message)
10     : std::runtime_error{make_message(context, message)}
11 {
12 }
13 EaxException::~EaxException() = default;
14
15
16 std::string EaxException::make_message(const char *context, const char *message)
17 {
18     const auto context_size = (context ? std::string::traits_type::length(context) : 0);
19     const auto has_contex = (context_size > 0);
20
21     const auto message_size = (message ? std::string::traits_type::length(message) : 0);
22     const auto has_message = (message_size > 0);
23
24     if (!has_contex && !has_message)
25     {
26         return std::string{};
27     }
28
29     static constexpr char left_prefix[] = "[";
30     const auto left_prefix_size = std::string::traits_type::length(left_prefix);
31
32     static constexpr char right_prefix[] = "] ";
33     const auto right_prefix_size = std::string::traits_type::length(right_prefix);
34
35     const auto what_size =
36         (
37             has_contex ?
38             left_prefix_size + context_size + right_prefix_size :
39             0) +
40         message_size +
41         1;
42
43     auto what = std::string{};
44     what.reserve(what_size);
45
46     if (has_contex)
47     {
48         what.append(left_prefix, left_prefix_size);
49         what.append(context, context_size);
50         what.append(right_prefix, right_prefix_size);
51     }
52
53     if (has_message)
54     {
55         what.append(message, message_size);
56     }
57
58     return what;
59 }