diff options
| author | Gau o fthe Veldt | 2016-07-17 16:43:10 -0700 |
|---|---|---|
| committer | Gau o fthe Veldt | 2016-07-23 12:52:41 -0700 |
| commit | 82d4cb5114a9d5f341dba84cbee51fcfe1504de6 (patch) | |
| tree | 372cb6449599b1a2ac9e743379b9058010e93a90 /core | |
| parent | 221cb58382ae34d4f91d9923fd979a328feabace (diff) | |
| download | godot-82d4cb5114a9d5f341dba84cbee51fcfe1504de6.tar.gz godot-82d4cb5114a9d5f341dba84cbee51fcfe1504de6.tar.zst godot-82d4cb5114a9d5f341dba84cbee51fcfe1504de6.zip | |
Added slicing operation to DVector via DVector.subarray(int start,int end) method.
Negative indices index from the end of the array.
Indices are range checked before attempting and return appropriate error when out of range.
Binding for RawArray in gdscript to access DVector.subarray() provided.
Documentation of RawArray.subarray() in classes.xml provided.
Diffstat (limited to 'core')
| -rw-r--r-- | core/dvector.h | 28 | ||||
| -rw-r--r-- | core/variant_call.cpp | 2 |
2 files changed, 30 insertions, 0 deletions
diff --git a/core/dvector.h b/core/dvector.h index a5519ed60..9a5464161 100644 --- a/core/dvector.h +++ b/core/dvector.h @@ -262,6 +262,34 @@ public: w[bs+i]=r[i]; } + DVector<T> subarray(int p_from, int p_to) { + + if (p_from<0) { + p_from=size()+p_from; + } + if (p_to<0) { + p_to=size()+p_to; + } + if (p_from<0 || p_from>=size()) { + DVector<T>& aux=*((DVector<T>*)0); // nullreturn + ERR_FAIL_COND_V(p_from<0 || p_from>=size(),aux) + } + if (p_to<0 || p_to>=size()) { + DVector<T>& aux=*((DVector<T>*)0); // nullreturn + ERR_FAIL_COND_V(p_to<0 || p_to>=size(),aux) + } + + DVector<T> slice; + int span=1 + p_to - p_from; + slice.resize(span); + Read r = read(); + Write w = slice.write(); + for (int i=0; i<span; ++i) { + w[i] = r[p_from+i]; + } + + return slice; + } Error insert(int p_pos,const T& p_val) { diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 7da4cef11..8c11007a5 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -517,6 +517,7 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var VCALL_LOCALMEM1(ByteArray,append); VCALL_LOCALMEM1(ByteArray,append_array); VCALL_LOCALMEM0(ByteArray,invert); + VCALL_LOCALMEM2R(ByteArray,subarray); VCALL_LOCALMEM0R(IntArray,size); VCALL_LOCALMEM2(IntArray,set); @@ -1532,6 +1533,7 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl ADDFUNC2(RAW_ARRAY,INT,ByteArray,insert,INT,"idx",INT,"byte",varray()); ADDFUNC1(RAW_ARRAY,NIL,ByteArray,resize,INT,"idx",varray()); ADDFUNC0(RAW_ARRAY,NIL,ByteArray,invert,varray()); + ADDFUNC2(RAW_ARRAY,RAW_ARRAY,ByteArray,subarray,INT,"from",INT,"to",varray()); ADDFUNC0(RAW_ARRAY,STRING,ByteArray,get_string_from_ascii,varray()); ADDFUNC0(RAW_ARRAY,STRING,ByteArray,get_string_from_utf8,varray()); |
