Skip to content

Commit 48d7b53

Browse files
agnatkkoopa
authored andcommitted
[Maybe types] Add MakeMaybe(...)
Wraps Locals in MaybeLocals. When called with a MaybeLocal it is the identity function and returns its argument. This is useful in writing generic template code on top of NAN.
1 parent 66ac6e6 commit 48d7b53

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Lo
185185
- <a href="doc/maybe_types.md#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
186186
- <a href="doc/maybe_types.md#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
187187
- <a href="doc/maybe_types.md#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
188+
- <a href="doc/maybe_types.md#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
188189

189190
### Script
190191

doc/maybe_types.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Lo
3636
- <a href="#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
3737
- <a href="#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
3838
- <a href="#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
39+
- <a href="#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
3940

4041
<a name="api_nan_maybe_local"></a>
4142
### Nan::MaybeLocal
@@ -478,3 +479,22 @@ Signature:
478479
```c++
479480
Nan::MaybeLocal<v8::Object> Nan::CloneElementAt(v8::Local<v8::Array> array, uint32_t index);
480481
```
482+
483+
<a name="api_nan_make_maybe"></a>
484+
### Nan::MakeMaybe()
485+
486+
Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN.
487+
488+
Synopsis:
489+
490+
```c++
491+
MaybeLocal<v8::Number> someNumber = MakeMaybe(New<v8::Number>(3.141592654));
492+
MaybeLocal<v8::String> someString = MakeMaybe(New<v8::String>("probably"));
493+
```
494+
495+
Signature:
496+
497+
```c++
498+
template <typename T, template <typename> class MaybeMaybe>
499+
Nan::MaybeLocal<T> Nan::MakeMaybe(MaybeMaybe<T> v);
500+
```

nan.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,6 +2186,32 @@ struct Tap {
21862186

21872187
#undef TYPE_CHECK
21882188

2189+
//=== Generic Maybefication ===================================================
2190+
2191+
namespace imp {
2192+
2193+
template <typename T> struct Maybefier;
2194+
2195+
template <typename T> struct Maybefier<v8::Local<T> > {
2196+
static MaybeLocal<T> convert(v8::Local<T> v) {
2197+
return MaybeLocal<T>(v);
2198+
}
2199+
};
2200+
2201+
template <typename T> struct Maybefier<MaybeLocal<T> > {
2202+
static MaybeLocal<T> convert(MaybeLocal<T> v) {
2203+
return v;
2204+
}
2205+
};
2206+
2207+
} // end of namespace imp
2208+
2209+
template <typename T, template <typename> class MaybeMaybe>
2210+
MaybeLocal<T>
2211+
MakeMaybe(MaybeMaybe<T> v) {
2212+
return imp::Maybefier<MaybeMaybe<T> >::convert(v);
2213+
}
2214+
21892215
} // end of namespace Nan
21902216

21912217
#endif // NAN_H_

test/cpp/nannew.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,13 @@ NAN_METHOD(newExternal) {
447447
info.GetReturnValue().Set(New<External>(&ttt));
448448
}
449449

450+
NAN_METHOD(invokeMakeMaybe) {
451+
Nan::MaybeLocal<v8::Number> number = MakeMaybe(New<v8::Number>(3.141592654));
452+
Nan::MaybeLocal<v8::String> string = MakeMaybe(New<v8::String>("probably"));
453+
(void)string;
454+
info.GetReturnValue().Set(number.ToLocalChecked());
455+
}
456+
450457
NAN_MODULE_INIT(Init) {
451458
NAN_EXPORT(target, testArray);
452459
NAN_EXPORT(target, testBoolean);
@@ -478,6 +485,8 @@ NAN_MODULE_INIT(Init) {
478485
NAN_EXPORT(target, newStringFromStdString);
479486

480487
NAN_EXPORT(target, newExternal);
488+
489+
NAN_EXPORT(target, invokeMakeMaybe);
481490
}
482491

483492
} // end of anonymous namespace

test/js/nannew-test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,8 @@ test('strings', function (t) {
4949
t.end();
5050
});
5151

52+
test('test MakeMaybe(...)', function (t) {
53+
t.plan(1);
54+
t.ok(bindings.invokeMakeMaybe() - Math.PI < 10e-8);
55+
t.end();
56+
});

0 commit comments

Comments
 (0)