Skip to content

Commit

Permalink
Overhaul clamping of range bounds
Browse files Browse the repository at this point in the history
Unify the algorithm used to implement clamping.

Also: remove special case where `operator setrange` when given `none` as sequence should behave like delrange.
  • Loading branch information
GrieferAtWork committed Nov 24, 2023
1 parent b6b9829 commit 3c15725
Show file tree
Hide file tree
Showing 33 changed files with 1,285 additions and 977 deletions.
1 change: 1 addition & 0 deletions include/deemon/alloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ DFUNDEF ATTR_COLD bool DCALL Dee_TryCollectMemory(size_t req_bytes);
/* Same as `Dee_TryCollectMemory()', but raise an
* `Error.NoMemory' if memory could not be collected. */
DFUNDEF WUNUSED ATTR_COLD bool DCALL Dee_CollectMemory(size_t req_bytes);
#define Dee_CollectMemoryc(elem_count, elem_size) Dee_CollectMemory((elem_count) * (elem_size))

/* Throw a bad-allocation error for `req_bytes' bytes.
* @return: -1: Always returns -1. */
Expand Down
98 changes: 28 additions & 70 deletions include/deemon/cxx/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -2131,10 +2131,10 @@ class RangeProxyObjBase {
class RangeProxyIdxObjBase {
private:
DeeObject *m_ptr;
size_t m_bgn;
Dee_ssize_t m_bgn;
DeeObject *m_end;
public:
RangeProxyIdxObjBase(DeeObject *ptr, size_t bgn, DeeObject *end) DEE_CXX_NOTHROW
RangeProxyIdxObjBase(DeeObject *ptr, Dee_ssize_t bgn, DeeObject *end) DEE_CXX_NOTHROW
: m_ptr(ptr)
, m_bgn(bgn)
, m_end(end) {}
Expand All @@ -2149,22 +2149,17 @@ class RangeProxyIdxObjBase {
return DeeObject_SetRangeBeginIndex(m_ptr, m_bgn, m_end, value);
}
void del() const {
int error;
DREF DeeObject *begin_ob;
begin_ob = throw_if_null(DeeInt_NewSize(m_bgn));
error = DeeObject_DelRange(m_ptr, begin_ob, m_end);
Dee_Decref(begin_ob);
throw_if_nonzero(error);
throw_if_nonzero(DeeObject_DelRangeBeginIndex(m_ptr, m_bgn, m_end));
}
};

class RangeProxyObjIdxBase {
private:
DeeObject *m_ptr;
DeeObject *m_bgn;
size_t m_end;
Dee_ssize_t m_end;
public:
RangeProxyObjIdxBase(DeeObject *ptr, DeeObject *bgn, size_t end) DEE_CXX_NOTHROW
RangeProxyObjIdxBase(DeeObject *ptr, DeeObject *bgn, Dee_ssize_t end) DEE_CXX_NOTHROW
: m_ptr(ptr)
, m_bgn(bgn)
, m_end(end) {}
Expand All @@ -2179,22 +2174,17 @@ class RangeProxyObjIdxBase {
return DeeObject_SetRangeEndIndex(m_ptr, m_bgn, m_end, value);
}
void del() const {
int error;
DREF DeeObject *end_ob;
end_ob = throw_if_null(DeeInt_NewSize(m_end));
error = DeeObject_DelRange(m_ptr, m_bgn, end_ob);
Dee_Decref(end_ob);
throw_if_nonzero(error);
throw_if_nonzero(DeeObject_DelRangeEndIndex(m_ptr, m_bgn, m_end));
}
};

class RangeProxyIdxBase {
private:
DeeObject *m_ptr;
size_t m_bgn;
size_t m_end;
Dee_ssize_t m_bgn;
Dee_ssize_t m_end;
public:
RangeProxyIdxBase(DeeObject *ptr, size_t bgn, size_t end) DEE_CXX_NOTHROW
RangeProxyIdxBase(DeeObject *ptr, Dee_ssize_t bgn, Dee_ssize_t end) DEE_CXX_NOTHROW
: m_ptr(ptr)
, m_bgn(bgn)
, m_end(end) {}
Expand All @@ -2209,18 +2199,7 @@ class RangeProxyIdxBase {
return DeeObject_SetRangeIndex(m_ptr, m_bgn, m_end, value);
}
void del() const {
int error;
DREF DeeObject *begin_ob, *end_ob;
begin_ob = throw_if_null(DeeInt_NewSize(m_bgn));
end_ob = DeeInt_NewSize(m_end);
if unlikely(!end_ob) {
Dee_Decref(begin_ob);
throw_last_deemon_exception();
}
error = DeeObject_DelRange(m_ptr, begin_ob, end_ob);
Dee_Decref(end_ob);
Dee_Decref(begin_ob);
throw_if_nonzero(error);
throw_if_nonzero(DeeObject_DelRangeIndex(m_ptr, m_bgn, m_end));
}
};

Expand All @@ -2244,7 +2223,7 @@ class RangeProxyIdxObj
{
public:
using ConstGetAndSetRefProxyWithDefault<RangeProxyIdxObj<RangeSeqType>, RangeSeqType>::operator=;
RangeProxyIdxObj(DeeObject *ptr, size_t bgn, DeeObject *end) DEE_CXX_NOTHROW
RangeProxyIdxObj(DeeObject *ptr, Dee_ssize_t bgn, DeeObject *end) DEE_CXX_NOTHROW
: RangeProxyIdxObjBase(ptr, bgn, end) {}
RangeProxyIdxObj(RangeProxyIdxObj const &right) DEE_CXX_NOTHROW
: RangeProxyIdxObjBase(static_cast<RangeProxyIdxObjBase const &>(right)) {}
Expand All @@ -2257,7 +2236,7 @@ class RangeProxyObjIdx
{
public:
using ConstGetAndSetRefProxyWithDefault<RangeProxyObjIdx<RangeSeqType>, RangeSeqType>::operator=;
RangeProxyObjIdx(DeeObject *ptr, DeeObject *bgn, size_t end) DEE_CXX_NOTHROW
RangeProxyObjIdx(DeeObject *ptr, DeeObject *bgn, Dee_ssize_t end) DEE_CXX_NOTHROW
: RangeProxyObjIdxBase(ptr, bgn, end) {}
RangeProxyObjIdx(RangeProxyObjIdx const &right) DEE_CXX_NOTHROW
: RangeProxyObjIdxBase(static_cast<RangeProxyObjIdxBase const &>(right)) {}
Expand All @@ -2270,7 +2249,7 @@ class RangeProxyIdx
{
public:
using ConstGetAndSetRefProxyWithDefault<RangeProxyIdx<RangeSeqType>, RangeSeqType>::operator=;
RangeProxyIdx(DeeObject *ptr, size_t bgn, size_t end) DEE_CXX_NOTHROW
RangeProxyIdx(DeeObject *ptr, Dee_ssize_t bgn, Dee_ssize_t end) DEE_CXX_NOTHROW
: RangeProxyIdxBase(ptr, bgn, end) {}
RangeProxyIdx(RangeProxyIdx const &right) DEE_CXX_NOTHROW
: RangeProxyIdxBase(static_cast<RangeProxyIdxBase const &>(right)) {}
Expand Down Expand Up @@ -2648,73 +2627,52 @@ class RangeProxyAccessor {
NONNULL_CXX((1, 2)) RangeProxyObj<RangeSeqType> range(DeeObject *begin, DeeObject *end) {
return RangeProxyObj<RangeSeqType>(((ProxyType *)this)->ptr(), begin, end);
}
NONNULL_CXX((1)) RangeProxyObjIdx<RangeSeqType> range(DeeObject *begin, size_t end) {
NONNULL_CXX((1)) RangeProxyObjIdx<RangeSeqType> range(DeeObject *begin, Dee_ssize_t end) {
return RangeProxyObjIdx<RangeSeqType>(((ProxyType *)this)->ptr(), begin, end);
}
NONNULL_CXX((2)) RangeProxyIdxObj<RangeSeqType> range(size_t begin, DeeObject *end) {
NONNULL_CXX((2)) RangeProxyIdxObj<RangeSeqType> range(Dee_ssize_t begin, DeeObject *end) {
return RangeProxyIdxObj<RangeSeqType>(((ProxyType *)this)->ptr(), begin, end);
}
RangeProxyIdx<RangeSeqType> range(size_t begin, size_t end) {
RangeProxyIdx<RangeSeqType> range(Dee_ssize_t begin, Dee_ssize_t end) {
return RangeProxyIdx<RangeSeqType>(((ProxyType *)this)->ptr(), begin, end);
}

NONNULL_CXX((1, 2)) Ref<RangeSeqType> getrange(DeeObject *begin, DeeObject *end) {
return inherit(DeeObject_GetRange(((ProxyType *)this)->ptr(), begin, end));
}
NONNULL_CXX((1)) Ref<RangeSeqType> getrange(DeeObject *begin, size_t end) {
NONNULL_CXX((1)) Ref<RangeSeqType> getrange(DeeObject *begin, Dee_ssize_t end) {
return inherit(DeeObject_GetRangeEndIndex(((ProxyType *)this)->ptr(), begin, end));
}
NONNULL_CXX((2)) Ref<RangeSeqType> getrange(size_t begin, DeeObject *end) {
NONNULL_CXX((2)) Ref<RangeSeqType> getrange(Dee_ssize_t begin, DeeObject *end) {
return inherit(DeeObject_GetRangeBeginIndex(((ProxyType *)this)->ptr(), begin, end));
}
Ref<RangeSeqType> getrange(size_t begin, size_t end) {
Ref<RangeSeqType> getrange(Dee_ssize_t begin, Dee_ssize_t end) {
return inherit(DeeObject_GetRangeIndex(((ProxyType *)this)->ptr(), begin, end));
}

NONNULL_CXX((1, 2)) void delrange(DeeObject *begin, DeeObject *end) {
throw_if_nonzero(DeeObject_DelRange(((ProxyType *)this)->ptr(), begin, end));
}
NONNULL_CXX((1)) void delrange(DeeObject *begin, size_t end) {
int error;
DREF DeeObject *end_ob;
end_ob = throw_if_null(DeeInt_NewSize(end));
error = DeeObject_DelRange(((ProxyType *)this)->ptr(), begin, end_ob);
Dee_Decref(end_ob);
throw_if_nonzero(error);
NONNULL_CXX((1)) void delrange(DeeObject *begin, Dee_ssize_t end) {
throw_if_nonzero(DeeObject_DelRangeEndIndex(((ProxyType *)this)->ptr(), begin, end));
}
NONNULL_CXX((2)) void delrange(size_t begin, DeeObject *end) {
int error;
DREF DeeObject *begin_ob;
begin_ob = throw_if_null(DeeInt_NewSize(begin));
error = DeeObject_DelRange(((ProxyType *)this)->ptr(), begin_ob, end);
Dee_Decref(begin_ob);
throw_if_nonzero(error);
NONNULL_CXX((2)) void delrange(Dee_ssize_t begin, DeeObject *end) {
throw_if_nonzero(DeeObject_DelRangeBeginIndex(((ProxyType *)this)->ptr(), begin, end));
}
void delrange(size_t begin, size_t end) {
int error;
DREF DeeObject *begin_ob, *end_ob;
begin_ob = throw_if_null(DeeInt_NewSize(begin));
end_ob = DeeInt_NewSize(end);
if unlikely(!end_ob) {
Dee_Decref(begin_ob);
throw_last_deemon_exception();
}
error = DeeObject_DelRange(((ProxyType *)this)->ptr(), begin_ob, end_ob);
Dee_Decref(end_ob);
Dee_Decref(begin_ob);
throw_if_nonzero(error);
void delrange(Dee_ssize_t begin, Dee_ssize_t end) {
throw_if_nonzero(DeeObject_DelRangeIndex(((ProxyType *)this)->ptr(), begin, end));
}

NONNULL_CXX((1, 2, 3)) void setrange(DeeObject *begin, DeeObject *end, DeeObject *value) {
return inherit(DeeObject_SetRange(((ProxyType *)this)->ptr(), begin, end, value));
}
NONNULL_CXX((1, 3)) void setrange(DeeObject *begin, size_t end, DeeObject *value) {
NONNULL_CXX((1, 3)) void setrange(DeeObject *begin, Dee_ssize_t end, DeeObject *value) {
return inherit(DeeObject_SetRangeEndIndex(((ProxyType *)this)->ptr(), begin, end, value));
}
NONNULL_CXX((2, 3)) void setrange(size_t begin, DeeObject *end, DeeObject *value) {
NONNULL_CXX((2, 3)) void setrange(Dee_ssize_t begin, DeeObject *end, DeeObject *value) {
return inherit(DeeObject_SetRangeBeginIndex(((ProxyType *)this)->ptr(), begin, end, value));
}
NONNULL_CXX((3)) void setrange(size_t begin, size_t end, DeeObject *value) {
NONNULL_CXX((3)) void setrange(Dee_ssize_t begin, Dee_ssize_t end, DeeObject *value) {
return inherit(DeeObject_SetRangeIndex(((ProxyType *)this)->ptr(), begin, end, value));
}
};
Expand Down
11 changes: 7 additions & 4 deletions include/deemon/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -3364,10 +3364,13 @@ DFUNDEF WUNUSED NONNULL((1, 3)) DREF DeeObject *(DCALL DeeObject_GetRangeBeginIn
DFUNDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *(DCALL DeeObject_GetRangeEndIndex)(DeeObject *self, DeeObject *begin, Dee_ssize_t end);
DFUNDEF WUNUSED NONNULL((1)) DREF DeeObject *(DCALL DeeObject_GetRangeIndex)(DeeObject *__restrict self, Dee_ssize_t begin, Dee_ssize_t end);
DFUNDEF WUNUSED NONNULL((1, 2, 3)) int (DCALL DeeObject_DelRange)(DeeObject *self, DeeObject *begin, DeeObject *end);
DFUNDEF WUNUSED NONNULL((1, 2, 3, 4)) int (DCALL DeeObject_SetRange)(DeeObject *self, DeeObject *begin, DeeObject *end, DeeObject *value);
DFUNDEF WUNUSED NONNULL((1, 3, 4)) int (DCALL DeeObject_SetRangeBeginIndex)(DeeObject *self, Dee_ssize_t begin, DeeObject *end, DeeObject *value);
DFUNDEF WUNUSED NONNULL((1, 2, 4)) int (DCALL DeeObject_SetRangeEndIndex)(DeeObject *self, DeeObject *begin, Dee_ssize_t end, DeeObject *value);
DFUNDEF WUNUSED NONNULL((1, 4)) int (DCALL DeeObject_SetRangeIndex)(DeeObject *self, Dee_ssize_t begin, Dee_ssize_t end, DeeObject *value);
DFUNDEF WUNUSED NONNULL((1, 3)) int (DCALL DeeObject_DelRangeBeginIndex)(DeeObject *self, Dee_ssize_t begin, DeeObject *end);
DFUNDEF WUNUSED NONNULL((1, 2)) int (DCALL DeeObject_DelRangeEndIndex)(DeeObject *self, DeeObject *begin, Dee_ssize_t end);
DFUNDEF WUNUSED NONNULL((1)) int (DCALL DeeObject_DelRangeIndex)(DeeObject *self, Dee_ssize_t begin, Dee_ssize_t end);
DFUNDEF WUNUSED NONNULL((1, 2, 3, 4)) int (DCALL DeeObject_SetRange)(DeeObject *self, DeeObject *begin, DeeObject *end, DeeObject *values);
DFUNDEF WUNUSED NONNULL((1, 3, 4)) int (DCALL DeeObject_SetRangeBeginIndex)(DeeObject *self, Dee_ssize_t begin, DeeObject *end, DeeObject *values);
DFUNDEF WUNUSED NONNULL((1, 2, 4)) int (DCALL DeeObject_SetRangeEndIndex)(DeeObject *self, DeeObject *begin, Dee_ssize_t end, DeeObject *values);
DFUNDEF WUNUSED NONNULL((1, 4)) int (DCALL DeeObject_SetRangeIndex)(DeeObject *self, Dee_ssize_t begin, Dee_ssize_t end, 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)
Expand Down
53 changes: 52 additions & 1 deletion include/deemon/seq.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ struct Dee_type_nsi {
__UINTPTR_HALF_TYPE__ nsi_class; /* Sequence class (One of `TYPE_SEQX_CLASS_*') */
__UINTPTR_HALF_TYPE__ nsi_flags; /* Sequence flags (Set of `TYPE_SEQX_F*') */
union {
Dee_funptr_t _nsi_class_functions[22];
Dee_funptr_t _nsi_class_functions[24];

struct {
/* [1..1] ERROR: (size_t)-1 */
Expand Down Expand Up @@ -383,6 +383,8 @@ struct Dee_type_nsi {

WUNUSED_T NONNULL_T((1)) DREF DeeObject *(DCALL *nsi_getrange)(DeeObject *__restrict self, Dee_ssize_t start, Dee_ssize_t end);
WUNUSED_T NONNULL_T((1)) DREF DeeObject *(DCALL *nsi_getrange_n)(DeeObject *__restrict self, Dee_ssize_t start); /* end: Dee_None */
WUNUSED_T NONNULL_T((1)) int (DCALL *nsi_delrange)(DeeObject *self, Dee_ssize_t start, Dee_ssize_t end);
WUNUSED_T NONNULL_T((1)) int (DCALL *nsi_delrange_n)(DeeObject *self, Dee_ssize_t start); /* end: Dee_None */
WUNUSED_T NONNULL_T((1, 4)) int (DCALL *nsi_setrange)(DeeObject *self, Dee_ssize_t start, Dee_ssize_t end, DeeObject *values);
WUNUSED_T NONNULL_T((1, 3)) int (DCALL *nsi_setrange_n)(DeeObject *self, Dee_ssize_t start, DeeObject *values); /* end: Dee_None */

Expand Down Expand Up @@ -486,6 +488,55 @@ struct Dee_type_nsi {
};


struct Dee_seq_range {
union {
#undef sr_start
#undef sr_istart
size_t sr_start; /* Start index (clamped) */
Dee_ssize_t sr_istart; /* Start index (input) */
}
#ifndef __COMPILER_HAVE_TRANSPARENT_UNION
_dee_aunion_s
#define sr_start _dee_aunion_s.sr_start
#define sr_istart _dee_aunion_s.sr_istart
#endif /* !__COMPILER_HAVE_TRANSPARENT_UNION */
;
union {
#undef sr_end
#undef sr_iend
size_t sr_end; /* End index (clamped) */
Dee_ssize_t sr_iend; /* End index (input) */
}
#ifndef __COMPILER_HAVE_TRANSPARENT_UNION
_dee_aunion_e
#define sr_end _dee_aunion_e.sr_end
#define sr_iend _dee_aunion_e.sr_iend
#endif /* !__COMPILER_HAVE_TRANSPARENT_UNION */
;
};


/* Clamp a range, as given to `operator [:]' & friends to the bounds
* accepted by the associated sequence. This handles stuff like negative
* index over-roll and past-the-end truncation. */
#define DeeSeqRange_Clamp(prange, istart, iend, size) \
((prange)->sr_istart = (istart), \
(prange)->sr_iend = (iend), \
_DeeSeqRange_Clamp(prange, size))
#define _DeeSeqRange_Clamp(prange, size) \
(void)(((prange)->sr_start <= (prange)->sr_end && \
(prange)->sr_end <= (size)) || \
(DeeSeqRange_DoClamp(prange, size), 0))
DFUNDEF ATTR_INOUT(1) void DCALL
DeeSeqRange_DoClamp(struct Dee_seq_range *__restrict self,
size_t size);

/* Specialized version of `DeeSeqRange_DoClamp()' for `[istart:none]' range expressions. */
#define DeeSeqRange_Clamp_n(istart, size) \
((size_t)(istart) <= (size) ? (size_t)(istart) : DeeSeqRange_DoClamp_n(istart, size))
DFUNDEF ATTR_CONST WUNUSED size_t DCALL
DeeSeqRange_DoClamp_n(Dee_ssize_t start, size_t size);


/* Lookup the closest NSI descriptor for `tp', or return `NULL'
* if the top-most type implementing any sequence operator doesn't
Expand Down
37 changes: 14 additions & 23 deletions src/deemon/compiler/asm/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,47 +138,38 @@ asm_gpush_s32(int32_t value) {

INTERN WUNUSED NONNULL((1)) DREF DeeObject *DCALL
tuple_getrange_i(DeeTupleObject *__restrict self,
dssize_t begin, dssize_t end);
dssize_t i_begin, dssize_t i_end);

INTERN WUNUSED NONNULL((1)) DREF DeeObject *DCALL
list_getrange_as_tuple(DeeListObject *__restrict self,
dssize_t begin, dssize_t end) {
dssize_t i_begin, dssize_t i_end) {
DREF DeeTupleObject *result;
size_t i;
struct Dee_seq_range range;
size_t range_size;
again:
DeeList_LockRead(self);
if unlikely(begin < 0)
begin += DeeList_SIZE(self);
if unlikely(end < 0)
end += DeeList_SIZE(self);
if unlikely((size_t)begin >= DeeList_SIZE(self) ||
(size_t)begin >= (size_t)end) {
DeeSeqRange_Clamp(&range, i_begin, i_end, DeeList_SIZE(self));
range_size = range.sr_end - range.sr_start;
if unlikely(range_size <= 0) {
/* Empty list. */
DeeList_LockEndRead(self);
return DeeList_New();
return_empty_tuple;
}
if unlikely((size_t)end > DeeList_SIZE(self))
end = (dssize_t)DeeList_SIZE(self);
end -= begin;
ASSERT(end != 0);
result = (DREF DeeTupleObject *)DeeObject_TryMalloc(offsetof(DeeTupleObject, t_elem) +
(size_t)end * sizeof(DREF DeeObject *));
result = (DREF DeeTupleObject *)DeeObject_TryMalloc(DeeTuple_SIZEOF(range_size));
if unlikely(!result) {
DeeList_LockEndRead(self);
if (Dee_CollectMemory(offsetof(DeeTupleObject, t_elem) +
(size_t)end * sizeof(DREF DeeObject *)))
if (Dee_CollectMemory(DeeTuple_SIZEOF(range_size)))
goto again;
goto err;
}

/* Copy vector elements. */
for (i = 0; i < (size_t)end; ++i) {
result->t_elem[i] = DeeList_GET(self, (size_t)begin + i);
Dee_Incref(result->t_elem[i]);
}
Dee_Movrefv(DeeTuple_ELEM(result),
DeeList_ELEM(self) + range.sr_start,
range_size);
DeeList_LockEndRead(self);
DeeObject_Init(result, &DeeTuple_Type);
result->t_size = (size_t)end;
result->t_size = range_size;
return (DREF DeeObject *)result;
err:
return NULL;
Expand Down
5 changes: 5 additions & 0 deletions src/deemon/linker-scripts/link-deemon-gcc-i386-cygwin.def
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,9 @@ EXPORTS
_DeeObject_DelItemStringHash@12=DeeObject_DelItemStringHash@12
_DeeObject_DelItemStringLenHash@16=DeeObject_DelItemStringLenHash@16
_DeeObject_DelRange@12=DeeObject_DelRange@12
_DeeObject_DelRangeBeginIndex@12=DeeObject_DelRangeBeginIndex@12
_DeeObject_DelRangeEndIndex@12=DeeObject_DelRangeEndIndex@12
_DeeObject_DelRangeIndex@12=DeeObject_DelRangeIndex@12
_DeeObject_Destroy@4=DeeObject_Destroy@4
_DeeObject_Destroy_d@12=DeeObject_Destroy_d@12
_DeeObject_Div@8=DeeObject_Div@8
Expand Down Expand Up @@ -743,6 +746,8 @@ EXPORTS
_DeeRoSet_Insert@8=DeeRoSet_Insert@8
_DeeRoSet_New@0=DeeRoSet_New@0
_DeeRoSet_NewWithHint@4=DeeRoSet_NewWithHint@4
_DeeSeqRange_DoClamp@8=DeeSeqRange_DoClamp@8
_DeeSeqRange_DoClamp_n@8=DeeSeqRange_DoClamp_n@8
_DeeSeq_All@4=DeeSeq_All@4
_DeeSeq_Any@4=DeeSeq_Any@4
_DeeSeq_AsHeapVector@8=DeeSeq_AsHeapVector@8
Expand Down
Loading

0 comments on commit 3c15725

Please sign in to comment.