public unsafe void InsertHead(T *ptr, int length)
        {
            if (length <= 0)
            {
                throw new ArgumentOutOfRangeException("invalid size");
            }

            /*
             * var sb = new System.Text.StringBuilder();
             * sb.Append($"InsertHead(before data, Length = {this.Length}, start = {_start.Value}):\n");
             * for (int i = 0; i < this.Length; i++) sb.Append(this[i]);
             * sb.Append('\n');
             * sb.Append("  >> insert data:\n");
             * for (int i = 0; i < length; i++) sb.Append(ptr[i]);
             * sb.Append('\n');
             * sb.Append('\n');
             */

            // when enough space exists in head
            if (length <= *_start)
            {
                *_start = *_start - length;
                UnsafeUtility.MemCpy(this.GetUnsafePtr(), ptr, UnsafeUtility.SizeOf <T>() * length);

                /*
                 * sb.Append($"InsertHead(without resize Length = {this.Length}):\n");
                 * for (int i = 0; i < this.Length; i++) sb.Append(this[i]);
                 * sb.Append('\n');
                 * UnityEngine.Debug.Log(sb.ToString());
                 */
                return;
            }

            // slide internal data
            int new_length = length + this.Length;
            int len_move   = this.Length;

            _list.ResizeUninitialized(new_length);
            T *dest   = (T *)_list.GetUnsafePtr() + length;
            T *source = (T *)_list.GetUnsafePtr() + *_start;

            UnsafeUtility.MemMove(dest, source, UnsafeUtility.SizeOf <T>() * len_move);

            // insert data
            *_start = 0;
            UnsafeUtility.MemCpy((void *)_list.GetUnsafePtr(), (void *)ptr, UnsafeUtility.SizeOf <T>() * length);

            /*
             * sb.Append($"InsertHead, Length = {this.Length}, start = {_start.Value}:\n");
             * for (int i = 0; i < this.Length; i++) sb.Append(this[i]);
             * sb.Append('\n');
             * UnityEngine.Debug.Log(sb.ToString());
             */
        }
 public bool GetBytes(UnsafeRefToNativeList <byte> buff, UnsafeRefToNativeList <Char16> str)
 {
     return(NativeBase64Decoder.GetBytesImpl(info_ptr, buff, (Char16 *)str.GetUnsafePtr(), str.Length));
 }
 public unsafe void Add(UnsafeRefToNativeList <Char16> str)
 {
     this.Add((Char16 *)str.GetUnsafePtr(), str.Length);
 }
 public void GetChars(UnsafeRefToNativeList <Char16> buff,
                      UnsafeRefToNativeList <byte> bytes,
                      bool splitData = false)
 {
     NativeBase64Encoder.GetCharsImpl(info_ptr, buff, (byte *)bytes.GetUnsafePtr(), bytes.Length, splitData);
 }
 /// <summary>
 /// specialize for UnsafeRefToNativeList<T>
 /// </summary>
 /// <param name="list"></param>
 public unsafe void Add(UnsafeRefToNativeList <T> list)
 {
     this.Add((T *)list.GetUnsafePtr(), list.Length);
 }