OSDN Git Service

[WIN32][CONFIG] Get rid of Assigned joystick.
[csp-qt/common_source_project-fm7.git] / source / src / ringbuffer.cpp
1 /*
2         Skelton for retropc emulator
3
4         Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2019.04.11-
6
7         [ ring buffer ]
8 */
9
10
11 #include "ringbuffer.h"
12
13 RINGBUFFER::RINGBUFFER(int s, int empty_warn, int fill_warn) : FIFO(s, empty_warn, fill_warn)
14 {
15         
16 }
17
18 void RINGBUFFER::write(int val, bool *p_fill_warn)
19 {
20         buf[wpt++] = val;
21         if(wpt >= size) {
22                 wpt = 0;
23         }
24         cnt++;
25         if(cnt >= size) {
26                 cnt = size;
27                 rpt = wpt - 1;
28                 if(rpt < 0) rpt = size - 1;
29         }
30         if(fill_warn_val < cnt) {
31                 fill_warn_flag = true;
32         } else {
33                 fill_warn_flag = false;
34         }
35         if(p_fill_warn != nullptr) {
36                 *p_fill_warn = fill_warn_flag;
37         }
38 }
39
40 int RINGBUFFER::read(bool *p_empty_warn)
41 {
42         int val = 0;
43         if(cnt) {
44                 val = buf[rpt++];
45                 if(rpt >= size) {
46                         rpt = 0;
47                 }
48                 cnt--;
49                 if(cnt <= 0) {
50                         cnt = 0;
51                         wpt = rpt;
52                 }
53                 if(empty_warn_val > cnt) {
54                         empty_warn_flag = true;
55                 } else {
56                         empty_warn_flag = false;
57                 }
58                 if(p_empty_warn != nullptr) {
59                         *p_empty_warn = empty_warn_flag;
60                 }
61         }
62         return val;
63 }
64
65 int RINGBUFFER::read_not_remove(int pt, bool *p_empty_warn)
66 {
67         if(pt >= 0 && pt < size) {
68                 pt += rpt;
69                 if(pt >= size) {
70                         pt -= size;
71                 }
72                 if(empty_warn_val > cnt) {
73                         empty_warn_flag = true;
74                 } else {
75                         empty_warn_flag = false;
76                 }
77                 if(p_empty_warn != nullptr) {
78                         *p_empty_warn = empty_warn_flag;
79                 }
80                 return buf[pt];
81         }
82         if(p_empty_warn != nullptr) {
83                 *p_empty_warn = false;
84         }
85         return 0;
86 }
87
88 void RINGBUFFER::write_not_push(int pt, int d, bool *p_fill_warn)
89 {
90         if(pt >= 0 && pt < size) {
91                 pt += wpt;
92                 if(pt >= size) {
93                         pt -= size;
94                 }
95                 buf[pt] = d;
96                 if(fill_warn_val < cnt) {
97                         fill_warn_flag = true;
98                 } else {
99                         fill_warn_flag = false;
100                 }
101                 if(p_fill_warn != nullptr) {
102                         *p_fill_warn = fill_warn_flag;
103                 }
104                 return;
105         }
106         if(p_fill_warn != nullptr) {
107                 *p_fill_warn = false;
108         }
109 }
110