Skip to content

Commit

Permalink
Get rid of DeeObject_GetItemDef
Browse files Browse the repository at this point in the history
  • Loading branch information
GrieferAtWork committed May 5, 2024
1 parent fe6e8df commit ea5c8db
Show file tree
Hide file tree
Showing 25 changed files with 586 additions and 687 deletions.
3 changes: 0 additions & 3 deletions include/deemon/cached-dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,6 @@ INTDEF WUNUSED NONNULL((1, 2)) DeeObject *DCALL DeeCachedDict_GetItemNRStringLen
INTDEF WUNUSED NONNULL((1, 2)) DeeObject *DCALL DeeCachedDict_TryGetItemNR(DeeCachedDictObject *self, DeeObject *key);
INTDEF WUNUSED NONNULL((1, 2)) DeeObject *DCALL DeeCachedDict_TryGetItemNRStringHash(DeeCachedDictObject *self, char const *__restrict key, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2)) DeeObject *DCALL DeeCachedDict_TryGetItemNRStringLenHash(DeeCachedDictObject *self, char const *__restrict key, size_t keylen, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2, 3)) DeeObject *DCALL DeeCachedDict_GetItemNRDef(DeeCachedDictObject *self, DeeObject *key, DeeObject *def);
INTDEF WUNUSED NONNULL((1, 2, 4)) DeeObject *DCALL DeeCachedDict_GetItemNRStringHashDef(DeeCachedDictObject *self, char const *__restrict key, Dee_hash_t hash, DeeObject *def);
INTDEF WUNUSED NONNULL((1, 2, 5)) DeeObject *DCALL DeeCachedDict_GetItemNRStringLenHashDef(DeeCachedDictObject *self, char const *__restrict key, size_t keylen, Dee_hash_t hash, DeeObject *def);
#endif /* CONFIG_BUILDING_DEEMON */

/* Hash iteration helpers. */
Expand Down
163 changes: 140 additions & 23 deletions include/deemon/cxx/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,12 @@ class ConstGetAndSetRefProxyWithDefault
using ConstGetAndSetRefProxy<ProxyType, GetReturnType>::operator=;
template<class S>
Ref<DEE_ENABLE_IF_OBJECT_ASSIGNABLE(GetReturnType, S)> get(S *def) const {
return inherit(((ProxyType const *)this)->_getref(def));
DREF DeeObject *result = ((ProxyType const *)this)->_trygetref();
if (result == ITER_DONE) {
result = (DREF DeeObject *)def;
Dee_Incref(result);
}
return inherit(result);
}
};

Expand Down Expand Up @@ -1927,8 +1932,8 @@ class ItemProxyObjBase {
WUNUSED DREF DeeObject *_getref() const DEE_CXX_NOTHROW {
return DeeObject_GetItem(m_ptr, m_idx);
}
WUNUSED DREF DeeObject *_getref(DeeObject *def) const DEE_CXX_NOTHROW {
return DeeObject_GetItemDef(m_ptr, m_idx, def);
WUNUSED DREF DeeObject *_trygetref() const DEE_CXX_NOTHROW {
return DeeObject_TryGetItem(m_ptr, m_idx);
}
WUNUSED int _setref(DeeObject *value) const DEE_CXX_NOTHROW {
return DeeObject_SetItem(m_ptr, m_idx, value);
Expand Down Expand Up @@ -1958,14 +1963,8 @@ class ItemProxyIdxBase {
WUNUSED DREF DeeObject *_getref() const DEE_CXX_NOTHROW {
return DeeObject_GetItemIndex(m_ptr, m_idx);
}
WUNUSED DREF DeeObject *_getref(DeeObject *def) const DEE_CXX_NOTHROW {
DREF DeeObject *index_ob, *result = NULL;
index_ob = DeeInt_NewSize(m_idx);
if likely(index_ob) {
result = DeeObject_GetItemDef(m_ptr, index_ob, def);
Dee_Decref(index_ob);
}
return result;
WUNUSED DREF DeeObject *_trygetref() const DEE_CXX_NOTHROW {
return DeeObject_TryGetItemIndex(m_ptr, m_idx);
}
WUNUSED int _setref(DeeObject *value) const DEE_CXX_NOTHROW {
return DeeObject_SetItemIndex(m_ptr, m_idx, value);
Expand Down Expand Up @@ -1998,8 +1997,8 @@ class ItemProxySthBase {
WUNUSED DREF DeeObject *_getref() const DEE_CXX_NOTHROW {
return DeeObject_GetItemStringHash(m_ptr, m_key, m_hsh);
}
WUNUSED DREF DeeObject *_getref(DeeObject *def) const DEE_CXX_NOTHROW {
return DeeObject_GetItemStringHashDef(m_ptr, m_key, m_hsh, def);
WUNUSED DREF DeeObject *_trygetref() const DEE_CXX_NOTHROW {
return DeeObject_TryGetItemStringHash(m_ptr, m_key, m_hsh);
}
WUNUSED int _setref(DeeObject *value) const DEE_CXX_NOTHROW {
return DeeObject_SetItemStringHash(m_ptr, m_key, m_hsh, value);
Expand Down Expand Up @@ -2035,8 +2034,8 @@ class ItemProxySnhBase {
WUNUSED DREF DeeObject *_getref() const DEE_CXX_NOTHROW {
return DeeObject_GetItemStringLenHash(m_ptr, m_key, m_len, m_hsh);
}
WUNUSED DREF DeeObject *_getref(DeeObject *def) const DEE_CXX_NOTHROW {
return DeeObject_GetItemStringLenHashDef(m_ptr, m_key, m_len, m_hsh, def);
WUNUSED DREF DeeObject *_trygetref(DeeObject *def) const DEE_CXX_NOTHROW {
return DeeObject_TryGetItemStringLenHash(m_ptr, m_key, m_len, m_hsh);
}
WUNUSED int _setref(DeeObject *value) const DEE_CXX_NOTHROW {
return DeeObject_SetItemStringLenHash(m_ptr, m_key, m_len, m_hsh, value);
Expand Down Expand Up @@ -2521,39 +2520,157 @@ class ItemProxyAccessor {
return ItemProxySnh<GetItemType>(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1)) DREF DeeObject *_getitem(DeeObject *index_or_key) {
return DeeObject_GetItem(((ProxyType *)this)->ptr(), index_or_key);
}
NONNULL_CXX((1)) DREF DeeObject *_getitem(size_t index) {
return DeeObject_GetItemIndex(((ProxyType *)this)->ptr(), index);
}
NONNULL_CXX((1)) DREF DeeObject *_getitem(char const *key) {
return DeeObject_GetItemString(((ProxyType *)this)->ptr(), key);
}
NONNULL_CXX((1)) DREF DeeObject *_getitem(char const *key, Dee_hash_t hash) {
return DeeObject_GetItemStringHash(((ProxyType *)this)->ptr(), key, hash);
}
NONNULL_CXX((1)) DREF DeeObject *_getitem(char const *key, size_t keylen, Dee_hash_t hash) {
return DeeObject_GetItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1)) DREF DeeObject *_trygetitem(DeeObject *index_or_key) {
return DeeObject_TryGetItem(((ProxyType *)this)->ptr(), index_or_key);
}
NONNULL_CXX((1)) DREF DeeObject *_trygetitem(size_t index) {
return DeeObject_TryGetItemIndex(((ProxyType *)this)->ptr(), index);
}
NONNULL_CXX((1)) DREF DeeObject *_trygetitem(char const *key) {
return DeeObject_TryGetItemString(((ProxyType *)this)->ptr(), key);
}
NONNULL_CXX((1)) DREF DeeObject *_trygetitem(char const *key, Dee_hash_t hash) {
return DeeObject_TryGetItemStringHash(((ProxyType *)this)->ptr(), key, hash);
}
NONNULL_CXX((1)) DREF DeeObject *_trygetitem(char const *key, size_t keylen, Dee_hash_t hash) {
return DeeObject_TryGetItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1)) int _bounditem(DeeObject *index_or_key) {
return DeeObject_BoundItem(((ProxyType *)this)->ptr(), index_or_key);
}
int _bounditem(size_t index) {
return DeeObject_BoundItemIndex(((ProxyType *)this)->ptr(), index);
}
NONNULL_CXX((1)) int _bounditem(char const *key) {
return DeeObject_BoundItemString(((ProxyType *)this)->ptr(), key);
}
NONNULL_CXX((1)) int _bounditem(char const *key, Dee_hash_t hash) {
return DeeObject_BoundItemStringHash(((ProxyType *)this)->ptr(), key, hash);
}
NONNULL_CXX((1)) int _bounditem(char const *key, size_t keylen, Dee_hash_t hash) {
return DeeObject_BoundItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1)) int _hasitem(DeeObject *index_or_key) {
return DeeObject_HasItem(((ProxyType *)this)->ptr(), index_or_key);
}
int _hasitem(size_t index) {
return DeeObject_HasItemIndex(((ProxyType *)this)->ptr(), index);
}
NONNULL_CXX((1)) int _hasitem(char const *key) {
return DeeObject_HasItemString(((ProxyType *)this)->ptr(), key);
}
NONNULL_CXX((1)) int _hasitem(char const *key, Dee_hash_t hash) {
return DeeObject_HasItemStringHash(((ProxyType *)this)->ptr(), key, hash);
}
NONNULL_CXX((1)) int _hasitem(char const *key, size_t keylen, Dee_hash_t hash) {
return DeeObject_HasItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1)) int _delitem(DeeObject *index_or_key) {
return DeeObject_DelItem(((ProxyType *)this)->ptr(), index_or_key);
}
int _delitem(size_t index) {
return DeeObject_DelItemIndex(((ProxyType *)this)->ptr(), index);
}
NONNULL_CXX((1)) int _delitem(char const *key) {
return DeeObject_DelItemString(((ProxyType *)this)->ptr(), key);
}
NONNULL_CXX((1)) int _delitem(char const *key, Dee_hash_t hash) {
return DeeObject_DelItemStringHash(((ProxyType *)this)->ptr(), key, hash);
}
NONNULL_CXX((1)) int _delitem(char const *key, size_t keylen, Dee_hash_t hash) {
return DeeObject_DelItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
}

NONNULL_CXX((1, 2)) int _setitem(DeeObject *index_or_key, DeeObject *value) {
return DeeObject_SetItem(((ProxyType *)this)->ptr(), index_or_key, value);
}
NONNULL_CXX((2)) int _setitem(size_t index, DeeObject *value) {
return DeeObject_SetItemIndex(((ProxyType *)this)->ptr(), index, value);
}
NONNULL_CXX((1, 2)) int _setitem(char const *key, DeeObject *value) {
return DeeObject_SetItemString(((ProxyType *)this)->ptr(), key, value);
}
NONNULL_CXX((1, 3)) int _setitem(char const *key, Dee_hash_t hash, DeeObject *value) {
return DeeObject_SetItemStringHash(((ProxyType *)this)->ptr(), key, hash, value);
}
NONNULL_CXX((1, 4)) int _setitem(char const *key, size_t keylen, Dee_hash_t hash, DeeObject *value) {
return DeeObject_SetItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash, value);
}


NONNULL_CXX((1)) Ref<GetItemType> getitem(DeeObject *index_or_key) {
return inherit(DeeObject_GetItem(((ProxyType *)this)->ptr(), index_or_key));
}
NONNULL_CXX((1, 2)) Ref<GetItemType> getitem(DeeObject *index_or_key, DeeObject *def) {
return inherit(DeeObject_GetItemDef(((ProxyType *)this)->ptr(), index_or_key, def));
DREF DeeObject *result = DeeObject_TryGetItem(((ProxyType *)this)->ptr(), index_or_key);
if (result == ITER_DONE) {
Dee_Incref(def);
result = def;
}
return inherit(result);
}
Ref<GetItemType> getitem(size_t index) {
return inherit(DeeObject_GetItemIndex(((ProxyType *)this)->ptr(), index));
}
NONNULL_CXX((2)) Ref<GetItemType> getitem(size_t index, DeeObject *def) {
DREF DeeObject *index_ob, *result;
index_ob = throw_if_null(DeeInt_NewSize(index));
result = DeeObject_GetItemDef(((ProxyType *)this)->ptr(), index_ob, def);
Dee_Decref(index_ob);
DREF DeeObject *result = DeeObject_TryGetItemIndex(((ProxyType *)this)->ptr(), index);
if (result == ITER_DONE) {
Dee_Incref(def);
result = def;
}
return inherit(result);
}
NONNULL_CXX((1)) Ref<GetItemType> getitem(char const *key) {
return inherit(DeeObject_GetItemString(((ProxyType *)this)->ptr(), key));
}
NONNULL_CXX((1, 2)) Ref<GetItemType> getitem(char const *key, DeeObject *def) {
return inherit(DeeObject_GetItemStringDef(((ProxyType *)this)->ptr(), key, def));
DREF DeeObject *result = DeeObject_TryGetItemString(((ProxyType *)this)->ptr(), key);
if (result == ITER_DONE) {
Dee_Incref(def);
result = def;
}
return inherit(result);
}
NONNULL_CXX((1)) Ref<GetItemType> getitem(char const *key, Dee_hash_t hash) {
return inherit(DeeObject_GetItemStringHash(((ProxyType *)this)->ptr(), key, hash));
}
NONNULL_CXX((1, 3)) Ref<GetItemType> getitem(char const *key, Dee_hash_t hash, DeeObject *def) {
return inherit(DeeObject_GetItemStringHashDef(((ProxyType *)this)->ptr(), key, hash, def));
DREF DeeObject *result = DeeObject_TryGetItemStringHash(((ProxyType *)this)->ptr(), key, hash);
if (result == ITER_DONE) {
Dee_Incref(def);
result = def;
}
return inherit(result);
}
NONNULL_CXX((1)) Ref<GetItemType> getitem(char const *key, size_t keylen, Dee_hash_t hash) {
return inherit(DeeObject_GetItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash));
}
NONNULL_CXX((1, 4)) Ref<GetItemType> getitem(char const *key, size_t keylen, Dee_hash_t hash, DeeObject *def) {
return inherit(DeeObject_GetItemStringLenHashDef(((ProxyType *)this)->ptr(), key, keylen, hash, def));
DREF DeeObject *result = DeeObject_TryGetItemStringLenHash(((ProxyType *)this)->ptr(), key, keylen, hash);
if (result == ITER_DONE) {
Dee_Incref(def);
result = def;
}
return inherit(result);
}

NONNULL_CXX((1)) bool bounditem(DeeObject *index_or_key) {
Expand Down
10 changes: 2 additions & 8 deletions include/deemon/cxx/tuple.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,8 @@ class _AbstractTupleItemWrapper
WUNUSED DREF DeeObject *_getref() const DEE_CXX_NOTHROW {
return DeeObject_GetItemIndex(m_self, Index);
}
WUNUSED DREF DeeObject *_getref(DeeObject *def) const DEE_CXX_NOTHROW {
DREF DeeObject *index_ob, *result = NULL;
index_ob = DeeInt_NewSize(Index);
if likely(index_ob) {
result = DeeObject_GetItemDef(m_self, index_ob, def);
Dee_Decref(index_ob);
}
return result;
WUNUSED DREF DeeObject *_trygetref() const DEE_CXX_NOTHROW {
return DeeObject_TryGetItemIndex(m_self, Index);
}
WUNUSED int _setref(DeeObject *value) const DEE_CXX_NOTHROW {
return DeeObject_SetItemIndex(m_self, Index, value);
Expand Down
12 changes: 0 additions & 12 deletions include/deemon/dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,7 @@ DFUNDEF WUNUSED NONNULL((1)) DREF DeeObject *DCALL DeeDict_FromRoDict(DeeObject
#ifdef CONFIG_BUILDING_DEEMON
INTDEF WUNUSED NONNULL((1, 2, 3)) DREF DeeObject *DCALL DeeDict_GetItemDef(DeeObject *self, DeeObject *key, DeeObject *def);
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL DeeDict_GetItemStringHash(DeeObject *__restrict self, char const *__restrict key, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2, 4)) DREF DeeObject *DCALL DeeDict_GetItemStringHashDef(DeeObject *self, char const *__restrict key, Dee_hash_t hash, DeeObject *def);
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL DeeDict_GetItemStringLenHash(DeeObject *__restrict self, char const *__restrict key, size_t keylen, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2, 5)) DREF DeeObject *DCALL DeeDict_GetItemStringLenHashDef(DeeObject *self, char const *__restrict key, size_t keylen, Dee_hash_t hash, DeeObject *def);
INTDEF WUNUSED NONNULL((1, 2)) bool DCALL DeeDict_HasItemStringHash(DeeObject *__restrict self, char const *__restrict key, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2)) bool DCALL DeeDict_HasItemStringLenHash(DeeObject *__restrict self, char const *__restrict key, size_t keylen, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2)) int DCALL DeeDict_DelItemStringHash(DeeObject *__restrict self, char const *__restrict key, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2)) int DCALL DeeDict_DelItemStringLenHash(DeeObject *__restrict self, char const *__restrict key, size_t keylen, Dee_hash_t hash);
INTDEF WUNUSED NONNULL((1, 2, 4)) int DCALL DeeDict_SetItemStringHash(DeeObject *self, char const *__restrict key, Dee_hash_t hash, DeeObject *value);
Expand All @@ -121,22 +117,14 @@ INTDEF WUNUSED NONNULL((1)) DREF DeeObject *DCALL DeeDict_ByHash(DeeObject *__re
#else /* CONFIG_BUILDING_DEEMON */
#define DeeDict_GetItemDef(self, key, def) ((*DeeDict_Type.tp_seq->tp_nsi->nsi_maplike.nsi_getdefault)(self, key, def))
#define DeeDict_GetItemStringHash(self, key, hash) DeeObject_GetItemStringHash(self, key, hash)
#define DeeDict_GetItemStringHashDef(self, key, hash, def) DeeObject_GetItemStringHashDef(self, key, hash, def)
#define DeeDict_GetItemStringLenHash(self, key, keylen, hash) DeeObject_GetItemStringLenHash(self, key, keylen, hash)
#define DeeDict_GetItemStringLenHashDef(self, key, keylen, hash, def) DeeObject_GetItemStringLenHashDef(self, key, keylen, hash, def)
#define DeeDict_HasItemStringHash(self, key, hash) DeeObject_HasItemStringHash(self, key, hash)
#define DeeDict_HasItemStringLenHash(self, key, keylen, hash) DeeObject_HasItemStringLenHash(self, key, keylen, hash)
#define DeeDict_DelItemStringHash(self, key, hash) DeeObject_DelItemStringHash(self, key, hash)
#define DeeDict_DelItemStringLenHash(self, key, keylen, hash) DeeObject_DelItemStringLenHash(self, key, keylen, hash)
#define DeeDict_SetItemStringHash(self, key, hash, value) DeeObject_SetItemStringHash(self, key, hash, value)
#define DeeDict_SetItemStringLenHash(self, key, keylen, hash, value) DeeObject_SetItemStringLenHash(self, key, keylen, hash, value)
#endif /* !CONFIG_BUILDING_DEEMON */
#define DeeDict_GetItemString(self, key) DeeDict_GetItemStringHash(self, key, Dee_HashStr(key))
#define DeeDict_GetItemStringLen(self, key, keylen) DeeDict_GetItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeDict_GetItemStringDef(self, key, def) DeeDict_GetItemStringHashDef(self, key, Dee_HashStr(key), def)
#define DeeDict_GetItemStringLenDef(self, key, keylen, def) DeeDict_GetItemStringLenHashDef(self, key, keylen, Dee_HashPtr(key, keylen), def)
#define DeeDict_HasItemString(self, key) DeeDict_HasItemStringHash(self, key, Dee_HashStr(key))
#define DeeDict_HasItemStringLen(self, key, keylen) DeeDict_HasItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeDict_DelItemString(self, key) DeeDict_DelItemStringHash(self, key, Dee_HashStr(key))
#define DeeDict_DelItemStringLen(self, key, keylen) DeeDict_DelItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeDict_SetItemString(self, key, value) DeeDict_SetItemStringHash(self, key, Dee_HashStr(key), value)
Expand Down
9 changes: 2 additions & 7 deletions include/deemon/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -4658,18 +4658,13 @@ DFUNDEF WUNUSED NONNULL((1, 4)) int (DCALL DeeObject_SetRangeIndex)(DeeObject *s
DFUNDEF WUNUSED NONNULL((1, 3)) int (DCALL DeeObject_SetRangeIndexN)(DeeObject *self, Dee_ssize_t begin, DeeObject *values);
#define DeeObject_GetItemString(self, key) DeeObject_GetItemStringHash(self, key, Dee_HashStr(key))
#define DeeObject_GetItemStringLen(self, key, keylen) DeeObject_GetItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeObject_GetItemStringDef(self, key, def) DeeObject_GetItemStringHashDef(self, key, Dee_HashStr(key), def)
#define DeeObject_GetItemStringLenDef(self, key, keylen, def) DeeObject_GetItemStringLenHashDef(self, key, keylen, Dee_HashPtr(key, keylen), def)
#define DeeObject_TryGetItemString(self, key) DeeObject_TryGetItemStringHash(self, key, Dee_HashStr(key))
#define DeeObject_TryGetItemStringLen(self, key, keylen) DeeObject_TryGetItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeObject_DelItemString(self, key) DeeObject_DelItemStringHash(self, key, Dee_HashStr(key))
#define DeeObject_DelItemStringLen(self, key, keylen) DeeObject_DelItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen))
#define DeeObject_SetItemString(self, key, value) DeeObject_SetItemStringHash(self, key, Dee_HashStr(key), value)
#define DeeObject_SetItemStringLen(self, key, keylen, value) DeeObject_SetItemStringLenHash(self, key, keylen, Dee_HashPtr(key, keylen), value)

/* TODO: These are deprecated in favor of "DeeObject_TryGetItem()" */
DFUNDEF WUNUSED NONNULL((1, 2, 3)) DREF DeeObject *(DCALL DeeObject_GetItemDef)(DeeObject *self, DeeObject *key, DeeObject *def);
DFUNDEF WUNUSED NONNULL((1, 2, 4)) DREF DeeObject *(DCALL DeeObject_GetItemStringHashDef)(DeeObject *self, char const *__restrict key, Dee_hash_t hash, DeeObject *def);
DFUNDEF WUNUSED NONNULL((1, 2, 5)) DREF DeeObject *(DCALL DeeObject_GetItemStringLenHashDef)(DeeObject *self, char const *__restrict key, size_t keylen, Dee_hash_t hash, DeeObject *def);

/* Check if a given item exists (`deemon.hasitem(self, index)')
* @return: 0: Doesn't exist;
* @return: 1: Does exists;
Expand Down
Loading

0 comments on commit ea5c8db

Please sign in to comment.