[Feature][T106]ZXW P56U09 code

Only Configure: Yes
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: No
Doc Update: No

Change-Id: I3cbd8b420271eb20c2b40ebe5c78f83059cd42f3
diff --git a/ap/lib/zlib/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs b/ap/lib/zlib/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs
new file mode 100644
index 0000000..c1cab3a
--- /dev/null
+++ b/ap/lib/zlib/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs
@@ -0,0 +1,83 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0.

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Diagnostics;

+

+namespace DotZLib

+{

+

+	/// <summary>

+	/// This class implements a circular buffer

+	/// </summary>

+	internal class CircularBuffer

+	{

+        #region Private data

+        private int _capacity;

+        private int _head;

+        private int _tail;

+        private int _size;

+        private byte[] _buffer;

+        #endregion

+

+        public CircularBuffer(int capacity)

+        {

+            Debug.Assert( capacity > 0 );

+            _buffer = new byte[capacity];

+            _capacity = capacity;

+            _head = 0;

+            _tail = 0;

+            _size = 0;

+        }

+

+        public int Size { get { return _size; } }

+

+        public int Put(byte[] source, int offset, int count)

+        {

+            Debug.Assert( count > 0 );

+            int trueCount = Math.Min(count, _capacity - Size);

+            for (int i = 0; i < trueCount; ++i)

+                _buffer[(_tail+i) % _capacity] = source[offset+i];

+            _tail += trueCount;

+            _tail %= _capacity;

+            _size += trueCount;

+            return trueCount;

+        }

+

+        public bool Put(byte b)

+        {

+            if (Size == _capacity) // no room

+                return false;

+            _buffer[_tail++] = b;

+            _tail %= _capacity;

+            ++_size;

+            return true;

+        }

+

+        public int Get(byte[] destination, int offset, int count)

+        {

+            int trueCount = Math.Min(count,Size);

+            for (int i = 0; i < trueCount; ++i)

+                destination[offset + i] = _buffer[(_head+i) % _capacity];

+            _head += trueCount;

+            _head %= _capacity;

+            _size -= trueCount;

+            return trueCount;

+        }

+

+        public int Get()

+        {

+            if (Size == 0)

+                return -1;

+

+            int result = (int)_buffer[_head++ % _capacity];

+            --_size;

+            return result;

+        }

+

+    }

+}