Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions doc/string.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ Napi::String::New(napi_env env, const char* value);
Napi::String::New(napi_env env, const char16_t* value);
Napi::String::New(napi_env env, const char* value, size_t length);
Napi::String::New(napi_env env, const char16_t* value, size_t length);
Napi::String::New(napi_env env, std::string_view value);
```

- `[in] env`: The `napi_env` environment in which to construct the `Napi::Value` object.
Expand All @@ -68,6 +69,7 @@ Napi::String::New(napi_env env, const char16_t* value, size_t length);
- `std::u16string&` - represents a UTF16-LE string.
- `const char*` - represents a UTF8 string.
- `const char16_t*` - represents a UTF16-LE string.
- `std::string_view` - represents a UTF8 string view.
- `[in] length`: The length of the string (not necessarily null-terminated) in code units.

Returns a new `Napi::String` that represents the passed in C++ string.
Expand Down
4 changes: 3 additions & 1 deletion doc/symbol.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Returns a new empty `Napi::Symbol`.
```cpp
Napi::Symbol::New(napi_env env, const std::string& description);
Napi::Symbol::New(napi_env env, const char* description);
Napi::Symbol::New(napi_env env, std::string_view description);
Napi::Symbol::New(napi_env env, Napi::String description);
Napi::Symbol::New(napi_env env, napi_value description);
```
Expand All @@ -27,6 +28,7 @@ Napi::Symbol::New(napi_env env, napi_value description);
`description` may be any of:
- `std::string&` - UTF8 string description.
- `const char*` - represents a UTF8 string description.
- `std::string_view` - represents a UTF8 string view.
- `String` - Node addon API String description.
- `napi_value` - Node-API `napi_value` description.

Expand Down Expand Up @@ -58,4 +60,4 @@ static Napi::Symbol Napi::Symbol::For(napi_env env, napi_value description);

Searches in the global registry for existing symbol with the given name. If the symbol already exist it will be returned, otherwise a new symbol will be created in the registry. It's equivalent to Symbol.for() called from JavaScript.

[`Napi::Name`]: ./name.md
[`Napi::Name`]: ./name.md
10 changes: 10 additions & 0 deletions napi-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#if NAPI_HAS_THREADS
#include <mutex>
#endif // NAPI_HAS_THREADS
#include <string_view>
#include <type_traits>
#include <utility>

Expand Down Expand Up @@ -1255,6 +1256,10 @@ inline String String::New(napi_env env, const std::u16string& val) {
return String::New(env, val.c_str(), val.size());
}

inline String String::New(napi_env env, std::string_view val) {
return String::New(env, val.data(), val.size());
}

inline String String::New(napi_env env, const char* val) {
// TODO(@gabrielschulhof) Remove if-statement when core's error handling is
// available in all supported versions.
Expand Down Expand Up @@ -1364,6 +1369,11 @@ inline Symbol Symbol::New(napi_env env, const std::string& description) {
return Symbol::New(env, descriptionValue);
}

inline Symbol Symbol::New(napi_env env, std::string_view description) {
napi_value descriptionValue = String::New(env, description);
return Symbol::New(env, descriptionValue);
}

inline Symbol Symbol::New(napi_env env, String description) {
napi_value descriptionValue = description;
return Symbol::New(env, descriptionValue);
Expand Down
13 changes: 13 additions & 0 deletions napi.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <mutex>
#endif // NAPI_HAS_THREADS
#include <string>
#include <string_view>
#include <vector>

// VS2015 RTM has bugs with constexpr, so require min of VS2015 Update 3 (known
Expand Down Expand Up @@ -718,6 +719,11 @@ class String : public Name {
const std::u16string& value ///< UTF-16 encoded C++ string
);

/// Creates a new String value from a UTF-8 encoded C++ string view.
static String New(napi_env env, ///< Node-API environment
std::string_view value ///< UTF-8 encoded C++ string view
);

/// Creates a new String value from a UTF-8 encoded C string.
static String New(
napi_env env, ///< Node-API environment
Expand Down Expand Up @@ -791,6 +797,13 @@ class Symbol : public Name {
description ///< UTF-8 encoded C++ string describing the symbol
);

/// Creates a new Symbol value with a description.
static Symbol New(
napi_env env, ///< Node-API environment
std::string_view
description ///< UTF-8 encoded C++ string view describing the symbol
);

/// Creates a new Symbol value with a description.
static Symbol New(napi_env env, ///< Node-API environment
String description ///< String value describing the symbol
Expand Down
14 changes: 14 additions & 0 deletions test/name.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "napi.h"

#include <string_view>

using namespace Napi;

const char* testValueUtf8 = "123456789";
Expand Down Expand Up @@ -43,6 +45,10 @@ Value CreateString(const CallbackInfo& info) {
}
}

Value CreateStringFromStringView(const CallbackInfo& info) {
return String::New(info.Env(), std::string_view("hello1"));
}

Value CheckString(const CallbackInfo& info) {
String value = info[0].As<String>();
String encoding = info[1].As<String>();
Expand Down Expand Up @@ -80,6 +86,10 @@ Value CreateSymbol(const CallbackInfo& info) {
}
}

Value CreateSymbolFromStringView(const CallbackInfo& info) {
return Symbol::New(info.Env(), std::string_view("hello2"));
}

Value CheckSymbol(const CallbackInfo& info) {
return Boolean::New(info.Env(), info[0].Type() == napi_symbol);
}
Expand All @@ -99,11 +109,15 @@ Object InitName(Env env) {

exports["echoString"] = Function::New(env, EchoString);
exports["createString"] = Function::New(env, CreateString);
exports["createStringFromStringView"] =
Function::New(env, CreateStringFromStringView);
exports["nullStringShouldThrow"] = Function::New(env, NullStringShouldThrow);
exports["nullString16ShouldThrow"] =
Function::New(env, NullString16ShouldThrow);
exports["checkString"] = Function::New(env, CheckString);
exports["createSymbol"] = Function::New(env, CreateSymbol);
exports["createSymbolFromStringView"] =
Function::New(env, CreateSymbolFromStringView);
exports["checkSymbol"] = Function::New(env, CheckSymbol);

return exports;
Expand Down
5 changes: 5 additions & 0 deletions test/name.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,9 @@ function test (binding) {
assert.strictEqual(binding.name.echoString(str, 'utf8'), str);
assert.strictEqual(binding.name.echoString(str, 'utf16'), str);
}

assert.strictEqual(binding.name.createStringFromStringView(), 'hello1');
const symFromStringView = binding.name.createSymbolFromStringView();
assert.strictEqual(typeof symFromStringView, 'symbol');
assert.strictEqual(symFromStringView.description, 'hello2');
}
Loading