MōBrowser API
Loading...
Searching...
No Matches
js_value.hpp
1// Copyright (c) 2000-2024 TeamDev. All rights reserved.
2// TeamDev PROPRIETARY and CONFIDENTIAL.
3// Use is subject to license terms.
4
5#ifndef MOBROWSER_JS_VALUE_HPP
6#define MOBROWSER_JS_VALUE_HPP
7
8#include <functional>
9#include <memory>
10#include <string>
11
12#include "mobrowser/base/internal/void_t.hpp"
13
14namespace mobrowser {
15
16class JsObject;
17class JsProxyObject;
18
19class JsValueImpl;
20
44class JsValue {
45 public:
50
58 template <class T>
59 static JsValue from(T&& value);
60
65 [[nodiscard]] bool isEmpty() const;
66
71 [[nodiscard]] const std::string& asString() const;
72
76 [[nodiscard]] bool isString() const;
77
82 [[nodiscard]] double asNumber() const;
83
87 [[nodiscard]] bool isNumber() const;
88
93 [[nodiscard]] bool asBool() const;
94
98 [[nodiscard]] bool isBool() const;
99
103 [[nodiscard]] std::shared_ptr<JsObject> asJsObject() const;
104
108 [[nodiscard]] std::shared_ptr<JsProxyObject> asJsProxyObject() const;
109
113 explicit operator bool() const;
114
115 JsValue& operator=(const JsValue& other);
116 JsValue& operator=(JsValue&& other);
117
118 JsValue(const JsValue& other);
119 JsValue(JsValue&& other);
120 ~JsValue();
121
122 private:
123 template <typename, typename = void>
124 struct IsFunctor : std::false_type {};
125
126 template <typename T>
127 struct IsFunctor<T, internal::void_t<decltype(&T::operator())>>
128 : std::true_type {};
129
130 template <class T>
131 using EnableIfNumber = typename std::enable_if<
132 std::is_floating_point<T>::value || std::is_integral<T>::value,
133 T*>::type;
134 template <class T>
135 using EnableIfFunction = typename std::enable_if<
136 std::is_function<typename std::remove_pointer<T>::type>::value,
137 T*>::type;
138 template <class T>
139 using EnableIfFunctor = typename std::enable_if<IsFunctor<T>::value, T*>::type;
140
141 template <class T>
142 explicit JsValue(T value, EnableIfNumber<T> = nullptr);
143 template <class T>
144 explicit JsValue(T value, EnableIfFunction<T> = nullptr);
145 template <class T>
146 explicit JsValue(T& value, EnableIfFunctor<T> = nullptr);
147 template <class T>
148 explicit JsValue(T&& value, EnableIfFunctor<T> = nullptr);
149 explicit JsValue(const char* value);
150 explicit JsValue(const std::string& value);
151 explicit JsValue(std::string&& value);
152 explicit JsValue(bool value);
153 explicit JsValue(double value);
154 explicit JsValue(std::shared_ptr<JsObject> value);
155 explicit JsValue(std::shared_ptr<JsProxyObject> value);
156
157 std::unique_ptr<JsValueImpl> impl_;
158};
159
160} // namespace mobrowser
161
162#endif // MOBROWSER_JS_VALUE_HPP
A JavaScript value.
Definition js_value.hpp:44
const std::string & asString() const
Returns the string that the value represents if it does, otherwise it should not be called.
static JsValue from(T &&value)
Constructs a JavaScript value from the convertible C++ one.
Definition js_value_detail.hpp:51
double asNumber() const
Returns the number that the value represents if it does, otherwise it should not be called.
std::shared_ptr< JsObject > asJsObject() const
Returns a JsObject if the value represents a boolean value.
bool isEmpty() const
Returns true if this JsValue does not hold a value (or, equally, represents null or undefined).
bool asBool() const
Returns the boolean that the value represents if it does, otherwise it should not be called.
bool isBool() const
Indicates if the given value represents a boolean.
bool isString() const
Indicates if the given value represents a string.
bool isNumber() const
Indicates if the given value represents a number.
std::shared_ptr< JsProxyObject > asJsProxyObject() const
Returns a JsProxyObject if the value represents a boolean value.
JsValue()
Constructs an empty JsValue.