Advertisement
Slapoguzov

Untitled

May 19th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.54 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Rub4
  7. {
  8. ///<summary>
  9. ///Кольцевой буфер
  10. ///</summary>
  11. ///<typeparam name="T">Тип данных в буфере</typeparam>
  12. public interface IRingBuffer<T>
  13. {
  14.  ///<summary>
  15.  ///Размер буфера
  16.  ///</summary>
  17.  int Size { get; }
  18.  ///<summary>
  19.  ///Количество элементов, которое можно поместить в буфер
  20.  ///</summary>
  21.  int FreeSpace { get; }
  22.  ///<summary>
  23.  ///Попытаться поместить элемент в буфер
  24.  ///</summary>
  25.  ///<param name="item">Новый элемент</param>
  26.  ///<returns>true, если удалось поместить элемент, иначе - false</returns>
  27.  bool TryPut(T item);
  28.  ///<summary>
  29.  ///Попытаться получить элемент из буфера
  30.  ///</summary>
  31.  ///<param name="item">Полученный элемент</param>
  32.  ///<returns>true, если удалось получить элемент, иначе - false</returns>
  33.  bool TryGet(out T item);
  34. }
  35.  
  36.  
  37.     public class RingBuffer<T> : IRingBuffer<T>
  38.     {
  39.         private int size;
  40.         public int freeSapce;
  41.  
  42.         private int first;
  43.         private int last;
  44.  
  45.         public int Size
  46.         {
  47.             get
  48.             {
  49.                 return size;
  50.             }
  51.         }
  52.         public int FreeSpace
  53.         {
  54.             get
  55.             {
  56.                 return freeSapce;
  57.             }
  58.  
  59.         }
  60.  
  61.         private T[] buffer;
  62.  
  63.         public RingBuffer()
  64.         {
  65.             buffer = new T[100];
  66.             this.size = 100;
  67.             this.freeSapce = 100;
  68.  
  69.             first = size / 2;
  70.             last = first;
  71.         }
  72.  
  73.         public RingBuffer(int size)
  74.         {
  75.             buffer = new T[size];
  76.             this.size = size;
  77.             this.freeSapce = size;
  78.  
  79.             first = size / 2;
  80.             last = first;
  81.         }
  82.  
  83.         public bool TryPut(T item)
  84.         {
  85.             if (freeSapce > 0)
  86.             {
  87.                 if (last < size)
  88.                 {
  89.                     buffer[last] = item;
  90.                     last++;
  91.  
  92.                 }
  93.                 else
  94.                 {
  95.                     buffer[size - last] = item;
  96.                     last = size - last;
  97.                 }
  98.                 freeSapce--;
  99.                 return true;
  100.             }
  101.             else
  102.             {
  103.                 return false;
  104.             }
  105.         }
  106.  
  107.         public bool TryGet(out T item)
  108.         {
  109.             try
  110.             {
  111.                 item = buffer[last-1];
  112.                 return true;
  113.             }
  114.             catch
  115.             {
  116.                 item = buffer[0];                       //костыль. Мы обязательно должны вернуть какое-то значение, но какое если произошла ошибка?
  117.                 return false;
  118.             }
  119.  
  120.         }
  121.  
  122.     }
  123.     class Program
  124.     {
  125.         static void Main(string[] args)
  126.         {
  127.             RingBuffer<int> test = new RingBuffer<int>(200);
  128.             for (int i = 0; i < 200; i++)
  129.             {
  130.                 test.TryPut(i);
  131.                 if (i % 2 == 0)
  132.                 {
  133.                     int t;
  134.                     test.TryGet(out t);
  135.                     Console.WriteLine(t.ToString());
  136.                 }
  137.             }
  138.  
  139.             Console.ReadLine();
  140.            
  141.         }
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement