55using VRC . SDKBase ;
66using VRC . Udon ;
77
8+ // Some work has a legacy of compatibility with UdonSharp 0.x version, and then I referred to some of Varneon's codes in the upgrade.
9+ // Varneon's VUdon-ArrayExtensions license: MIT License
10+ // Reference code: https://github.com/Varneon/VUdon-ArrayExtensions/blob/main/Packages/com.varneon.vudon.array-extensions/Runtime/UdonArrayExtensions.cs
11+
812namespace UdonLab
913{
1014 public class UdonArrayPlus : UdonSharpBehaviour
@@ -13,65 +17,65 @@ public static T[] Add<T>(T[] _array, T _value, bool duplicates = true)
1317 {
1418 if ( ! duplicates )
1519 {
16- int _index = Index ( _array , _value ) ;
17- if ( _index != - 1 )
20+ if ( IndexOf ( _array , _value ) != - 1 )
1821 return _array ;
1922 }
20- T [ ] _newArray = new T [ _array . Length + 1 ] ;
21- Array . Copy ( _array , _newArray , _array . Length ) ;
22- _newArray [ _array . Length ] = _value ;
23+ var length = _array . Length ;
24+ var _newArray = new T [ length + 1 ] ;
25+ Array . Copy ( _array , _newArray , length ) ;
26+ _newArray . SetValue ( _value , length ) ;
2327 return _newArray ;
2428 }
25- public static T [ ] AddIndex < T > ( T [ ] _array , T _value , int index , bool duplicates = true )
29+ public static T [ ] Insert < T > ( T [ ] array , int index , T item , bool duplicates = true )
2630 {
2731 if ( ! duplicates )
2832 {
29- int _index = Index ( _array , _value ) ;
30- if ( _index != - 1 )
31- return _array ;
33+ if ( IndexOf ( array , item ) != - 1 )
34+ return array ;
3235 }
33- if ( index < 0 || index > _array . Length )
36+ var length = array . Length ;
37+
38+ index = Mathf . Clamp ( index , 0 , length ) ;
39+
40+ var newArray = new T [ length + 1 ] ;
41+
42+ newArray . SetValue ( item , index ) ;
43+
44+ if ( index == 0 )
3445 {
35- return _array ;
46+ Array . Copy ( array , 0 , newArray , 1 , length ) ;
3647 }
37- else if ( index == _array . Length )
48+ else if ( index == length )
3849 {
39- return Add ( _array , _value ) ;
50+ Array . Copy ( array , 0 , newArray , 0 , length ) ;
4051 }
4152 else
4253 {
43- T [ ] _newArray = new T [ _array . Length + 1 ] ;
44- for ( int i = 0 ; i < index ; i ++ )
45- {
46- _newArray [ i ] = _array [ i ] ;
47- }
48- _newArray [ index ] = _value ;
49- for ( int i = index + 1 ; i < _array . Length + 1 ; i ++ )
50- {
51- _newArray [ i ] = _array [ i - 1 ] ;
52- }
53- return _newArray ;
54+ Array . Copy ( array , 0 , newArray , 0 , index ) ;
55+ Array . Copy ( array , index , newArray , index + 1 , length - index ) ;
5456 }
57+
58+ return newArray ;
5559 }
56- public static int Find < T > ( T [ ] _array , T _value )
60+ public static bool Contains < T > ( T [ ] array , T item )
5761 {
58- return Index ( _array , _value ) ;
62+ return IndexOf ( array , item ) >= 0 ;
5963 }
6064 public static int [ ] FindAll < T > ( T [ ] _array , T _value )
6165 {
62- int [ ] _index = new int [ 0 ] ;
66+ var _indexs = new int [ 0 ] ;
6367 for ( int i = 0 ; i < _array . Length ; i ++ )
6468 {
6569 if ( _array [ i ] . Equals ( _value ) )
6670 {
67- _index = Add ( _index , i ) ;
71+ _indexs = Add ( _indexs , i ) ;
6872 }
6973 }
70- return _index ;
74+ return _indexs ;
7175 }
7276 public static T [ ] FindAllValue < T > ( T [ ] _array , T _value )
7377 {
74- T [ ] _newArray = new T [ 0 ] ;
78+ var _newArray = new T [ 0 ] ;
7579 for ( int i = 0 ; i < _array . Length ; i ++ )
7680 {
7781 if ( _array [ i ] . Equals ( _value ) )
@@ -81,36 +85,42 @@ public static T[] FindAllValue<T>(T[] _array, T _value)
8185 }
8286 return _newArray ;
8387 }
84- public static int Index < T > ( T [ ] _array , T _value )
88+ public static int IndexOf < T > ( T [ ] _array , T _value )
8589 {
86- for ( int i = 0 ; i < _array . Length ; i ++ )
87- {
88- if ( _array [ i ] . Equals ( _value ) )
89- return i ;
90- }
91- return - 1 ;
90+ return Array . IndexOf ( _array , _value ) ;
9291 }
93- public static T [ ] RemoveIndex < T > ( T [ ] _array , int index )
92+ public static T [ ] RemoveAt < T > ( T [ ] array , int index )
9493 {
95- if ( index < 0 || index >= _array . Length )
96- return _array ;
97- T [ ] _newArray = new T [ _array . Length - 1 ] ;
98- for ( int i = 0 ; i < index ; i ++ )
94+ int length = array . Length ;
95+
96+ if ( index >= length || index < 0 ) { return array ; }
97+
98+ int maxIndex = length - 1 ;
99+
100+ T [ ] newArray = new T [ maxIndex ] ;
101+
102+ if ( index == 0 )
99103 {
100- _newArray [ i ] = _array [ i ] ;
104+ Array . Copy ( array , 1 , newArray , 0 , maxIndex ) ;
101105 }
102- for ( int i = index ; i < _array . Length - 1 ; i ++ )
106+ else if ( index == maxIndex )
103107 {
104- _newArray [ i ] = _array [ i + 1 ] ;
108+ Array . Copy ( array , 0 , newArray , 0 , maxIndex ) ;
105109 }
106- return _newArray ;
110+ else
111+ {
112+ Array . Copy ( array , 0 , newArray , 0 , index ) ;
113+ Array . Copy ( array , index + 1 , newArray , index , maxIndex - index ) ;
114+ }
115+
116+ return newArray ;
107117 }
108118 public static T [ ] Remove < T > ( T [ ] _array , T _value )
109119 {
110- int index = Index ( _array , _value ) ;
120+ var index = IndexOf ( _array , _value ) ;
111121 if ( index == - 1 )
112122 return _array ;
113- return RemoveIndex ( _array , index ) ;
123+ return RemoveAt ( _array , index ) ;
114124 }
115125 // String
116126 public static string [ ] StringsFindLikeAll ( string [ ] _array , string _value )
@@ -138,94 +148,6 @@ public static VRCUrl[] VRCUrlsFindLikeAll(VRCUrl[] _array, string _value)
138148 }
139149 return _newArray ;
140150 }
141- public static int VRCUrlsFind ( VRCUrl [ ] _array , VRCUrl _value )
142- {
143- return VRCUrlsIndex ( _array , _value ) ;
144- }
145- public static int [ ] VRCUrlsFindAll ( VRCUrl [ ] _array , VRCUrl _value )
146- {
147- int [ ] _index = new int [ 0 ] ;
148- for ( int i = 0 ; i < _array . Length ; i ++ )
149- {
150- if ( _array [ i ] . ToString ( ) == _value . ToString ( ) )
151- {
152- _index = Add ( _index , i ) ;
153- }
154- }
155- return _index ;
156- }
157- public static VRCUrl [ ] VRCUrlsFindAllValue ( VRCUrl [ ] _array , VRCUrl _value )
158- {
159- VRCUrl [ ] _newArray = new VRCUrl [ 0 ] ;
160- for ( int i = 0 ; i < _array . Length ; i ++ )
161- {
162- if ( _array [ i ] . ToString ( ) == _value . ToString ( ) )
163- {
164- _newArray = VRCUrlsAdd ( _newArray , _array [ i ] ) ;
165- }
166- }
167- return _newArray ;
168- }
169- public static int VRCUrlsIndex ( VRCUrl [ ] _array , VRCUrl _value )
170- {
171- for ( int i = 0 ; i < _array . Length ; i ++ )
172- {
173- if ( _array [ i ] . ToString ( ) == _value . ToString ( ) )
174- return i ;
175- }
176- return - 1 ;
177- }
178- public static VRCUrl [ ] VRCUrlsAdd ( VRCUrl [ ] _array , VRCUrl _value , bool duplicates = true )
179- {
180- if ( ! duplicates )
181- {
182- int _index = VRCUrlsIndex ( _array , _value ) ;
183- if ( _index != - 1 )
184- return _array ;
185- }
186- VRCUrl [ ] _newArray = new VRCUrl [ _array . Length + 1 ] ;
187- Array . Copy ( _array , _newArray , _array . Length ) ;
188- _newArray [ _array . Length ] = _value ;
189- return _newArray ;
190- }
191- public static VRCUrl [ ] VRCUrlsAddIndex ( VRCUrl [ ] _array , VRCUrl _value , int index , bool duplicates = true )
192- {
193- if ( ! duplicates )
194- {
195- int _index = VRCUrlsIndex ( _array , _value ) ;
196- if ( _index != - 1 )
197- return _array ;
198- }
199- if ( index < 0 || index > _array . Length )
200- {
201- return _array ;
202- }
203- else if ( index == _array . Length )
204- {
205- return VRCUrlsAdd ( _array , _value ) ;
206- }
207- else
208- {
209- VRCUrl [ ] _newArray = new VRCUrl [ _array . Length + 1 ] ;
210- for ( int i = 0 ; i < index ; i ++ )
211- {
212- _newArray [ i ] = _array [ i ] ;
213- }
214- _newArray [ index ] = _value ;
215- for ( int i = index + 1 ; i < _array . Length + 1 ; i ++ )
216- {
217- _newArray [ i ] = _array [ i - 1 ] ;
218- }
219- return _newArray ;
220- }
221- }
222- public static VRCUrl [ ] VRCUrlsRemove ( VRCUrl [ ] _array , VRCUrl _value )
223- {
224- int index = VRCUrlsIndex ( _array , _value ) ;
225- if ( index == - 1 )
226- return _array ;
227- return RemoveIndex ( _array , index ) ;
228- }
229151 // Int
230152 public static int [ ] IntsSort ( int [ ] _array , bool reverse = false )
231153 {
@@ -322,7 +244,7 @@ public static int PlayersIndexName(VRCPlayerApi[] players, string _name)
322244 }
323245 public static VRCPlayerApi [ ] PlayersAdd ( VRCPlayerApi [ ] players , VRCPlayerApi _player , bool force = false )
324246 {
325- int index = PlayersIndex ( players , _player ) ;
247+ var index = PlayersIndex ( players , _player ) ;
326248 if ( index != - 1 && ! force )
327249 return players ;
328250 VRCPlayerApi [ ] newPlayers = new VRCPlayerApi [ players . Length + 1 ] ;
@@ -360,7 +282,7 @@ public static VRCPlayerApi[] PlayersAddIndex(VRCPlayerApi[] players, VRCPlayerAp
360282 }
361283 public static VRCPlayerApi [ ] PlayersRemove ( VRCPlayerApi [ ] players , VRCPlayerApi _player )
362284 {
363- int index = PlayersIndex ( players , _player ) ;
285+ var index = PlayersIndex ( players , _player ) ;
364286 if ( index == - 1 )
365287 {
366288 return players ;
0 commit comments