queue.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #define QUEUE_C
  2. // Author: Ershov V.
  3. // Modified: Sychov. A / 12/2020
  4. #include "app/queue/queue.h"
  5. int queue_pushback(queue_t * self, queue_record_t * record)
  6. {
  7. my_assert(record);
  8. my_assert(self);
  9. RING_BUFFER_RC_TYPE freeSpace = ringbuf_free_space(self);
  10. if(freeSpace < record->size)
  11. {
  12. return QUEUE_RC_NO_MEMORY;
  13. }
  14. RING_BUFFER_RC_TYPE rc = ringbuf_write(self, (void *)record, record->size);
  15. my_assert(record->size == rc);
  16. (void)rc;
  17. return QUEUE_RC_NOERROR;
  18. }
  19. int queue_pushfront(queue_t * self, queue_record_t * record)
  20. {
  21. my_assert(self);
  22. my_assert(record);
  23. RING_BUFFER_RC_TYPE freeSpace = ringbuf_free_space(self);
  24. if(freeSpace < record->size)
  25. {
  26. return QUEUE_RC_NO_MEMORY;
  27. }
  28. RING_BUFFER_RC_TYPE rc = ringbuf_write_front(self, (void *)record, record->size);
  29. my_assert(record->size == rc);
  30. (void)rc;
  31. return QUEUE_RC_NOERROR;
  32. }
  33. int queue_peek(const queue_t * self, queue_record_t * record, int16_t size)
  34. {
  35. // Reading t struct first and getting size of whole
  36. // record struct. Then reading entire record struct.
  37. my_assert(self);
  38. my_assert(record);
  39. my_assert(sizeof(*record) <= size);
  40. RING_BUFFER_RC_TYPE rc = ringbuf_peek(self, (void *)record, sizeof(*record));
  41. my_assert(sizeof(*record) == rc);
  42. if(sizeof(*record) != rc)
  43. {
  44. return QUEUE_RC_EMPTY;
  45. }
  46. my_assert(record->size <= ringbuf_size(self));
  47. int16_t record_size = record->size;
  48. if(record_size > size)
  49. {
  50. return QUEUE_RC_NO_MEMORY;
  51. }
  52. rc = ringbuf_peek(self, (void *)record, record_size);
  53. my_assert(record_size == rc);
  54. if(record_size != rc)
  55. {
  56. return QUEUE_RC_INTERNAL_ERROR;
  57. }
  58. return record->size;
  59. }
  60. int queue_removefront(queue_t * self)
  61. {
  62. my_assert(self);
  63. queue_record_t record;
  64. RING_BUFFER_RC_TYPE rc = ringbuf_peek(self, (void *)&record, sizeof(record));
  65. my_assert(0 <= rc);
  66. if(0 == rc)
  67. {
  68. return 0;
  69. }
  70. my_assert(record.size <= ringbuf_size(self));
  71. rc = ringbuf_erase(self, record.size);
  72. my_assert(0 <= rc);
  73. return rc;
  74. }