Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.95 KB | None | 0 0
  1. #if !defined(RLT_H)
  2. #define RLT_H
  3.  
  4. #include <stdint.h>
  5. #include <stddef.h>
  6. #include <assert.h>
  7. #include <stdlib.h>
  8.  
  9. // NOTE(rohan): typedefs
  10. typedef int8_t    s8;
  11. typedef int16_t   s16;
  12. typedef int32_t   s32;
  13. typedef int64_t   s64;  
  14.  
  15. typedef uint8_t   u8;
  16. typedef uint16_t  u16;
  17. typedef uint32_t  u32;
  18. typedef uint64_t  u64;    
  19.  
  20. typedef s32       b32;
  21.  
  22. typedef float     f32;
  23. typedef double    f64;
  24.  
  25. typedef size_t    usize;
  26. typedef uintptr_t uptr;
  27. typedef intptr_t  sptr;
  28.  
  29. // NOTE(rohan): constants
  30. #define RLT_VERSION  1
  31. #define M_PI  3.14159265358979323846f
  32.  
  33. // NOTE(rohan): min and max
  34. #define rlt_min(a,b) ((a) < (b) ? (a) : (b))
  35. #define rlt_max(a,b) ((a) > (b) ? (a) : (b))
  36.  
  37. // NOTE(rohan): lerp and unlerp
  38. #define rlt_lerp(a,b,t)   ((a) + (t) * (float) ((b)-(a)))
  39. #define rlt_unlerp(a,b,t) (((t) - (a)) / (float) ((b) - (a)))
  40.  
  41. // NOTE(rohan): clamp
  42. #define rlt_clamp(x,xmin,xmax)  ((x) < (xmin) ? (xmin) : (x) > (xmax) ? (xmax) : (x))
  43.  
  44. // NOTE(rohan): degrees and radians
  45. #define deg2rad(a)  ((a)*(M_PI / 180))
  46. #define rad2deg(a)  ((a)*(180 / M_PI))
  47.  
  48. // NOTE(rohan): helper macros
  49. #define swap(TYPE,a,b)  \
  50.     do { TYPE rlt__t; rlt__t = (a); (a) = (b); (b) = rlt__t; } while (0)
  51.  
  52. // NOTE(rohan): API function prototypes
  53. #ifdef __cplusplus
  54. #define EXTERN_C extern "C" {
  55. #define EXTERN_C_END }
  56. #else
  57. #define EXTERN_C
  58. #define EXTERN_C_END
  59. #endif
  60.  
  61. #ifdef RLT_STATIC
  62. #define RLTDEF static
  63. #else
  64. #define RLTDEF extern
  65. #endif
  66.  
  67. // NOTE(rohan): stretchy buffers
  68. typedef struct BufHdr
  69. {
  70.     usize len;
  71.     usize cap;
  72.     char buf[0];
  73. } BufHdr;
  74.  
  75. #define buf__hdr(b) ((BufHdr *)((char *)b - offsetof(BufHdr, buf)))
  76. #define buf__fits(b, n) (buf_len(b) + (n) <= buf_cap(b))
  77. #define buf__fit(b, n) (buf__fits(b, n) ? 0 : ((b) = buf__grow((b), buf_len(b) + (n), sizeof(*(b)))))
  78.  
  79. #define buf_len(b) ((b) ? buf__hdr(b)->len : 0)
  80. #define buf_cap(b) ((b) ? buf__hdr(b)->cap : 0)
  81. #define buf_push(b, x) (buf__fit(b, 1), (b)[buf_len(b)] = (x), buf__hdr(b)->len++)
  82. #define buf_free(b) ((b) ? free(buf__hdr(b)) : 0)
  83. EXTERN_C
  84. RLTDEF void *buf__grow(const void *buf, usize new_len, usize elem_size);
  85. EXTERN_C_END
  86.  
  87. // NOTE(rohan): quick sort
  88.  
  89. #define RLT_(prefix, name) rlt__##prefix##name
  90.  
  91. #define rlt_declare_sort(FUNCNAME, TYPE)                                \
  92. void FUNCNAME(TYPE *p, int n)
  93.  
  94. #define rlt_define_sort(FUNCNAME, TYPE, COMPARE)                        \
  95. rlt__define_sort(void, FUNCNAME, TYPE, COMPARE)
  96.  
  97. #define rlt_define_sort_static(FUNCNAME, TYPE, COMPARE)                 \
  98. rlt__define_sort(static void, FUNCNAME, TYPE, COMPARE)
  99.  
  100. #define rlt__define_sort(MODE, FUNCNAME, TYPE, COMPARE)                 \
  101.                                                                         \
  102. static void RLT_(FUNCNAME, _insertsort)(TYPE *p, int n)                 \
  103. {                                                                       \
  104.     int i, j;                                                           \
  105.     for (i = 1; i < n; ++i)                                             \
  106.     {                                                                   \
  107.         TYPE t = p[i], *a = &t;                                         \
  108.         j = i;                                                          \
  109.         while (j > 0)                                                   \
  110.         {                                                               \
  111.             TYPE *b = &p[j - 1];                                        \
  112.             int c = COMPARE;                                            \
  113.             if (!c) break;                                              \
  114.             p[j] = p[j - 1];                                            \
  115.             --j;                                                        \
  116.         }                                                               \
  117.                                                                         \
  118.         if (i != j)                                                     \
  119.             p[j] = t;                                                   \
  120.     }                                                                   \
  121. }                                                                       \
  122.                                                                         \
  123. static void RLT_(FUNCNAME, _quicksort)(TYPE *p, int n)                  \
  124. {                                                                       \
  125.     /* threshhold for transitioning to insertion sort */                \
  126.     while (n > 12)                                                      \
  127.     {                                                                   \
  128.         TYPE *a, *b, t;                                                 \
  129.         int c01, c12, c, m, i, j;                                       \
  130.                                                                         \
  131.         /* compute median of three */                                   \
  132.         m = n >> 1;                                                     \
  133.         a = &p[0];                                                      \
  134.         b = &p[m];                                                      \
  135.         c = COMPARE;                                                    \
  136.         c01 = c;                                                        \
  137.         a = &p[m];                                                      \
  138.         b = &p[n-1];                                                    \
  139.         c = COMPARE;                                                    \
  140.         c12 = c;                                                        \
  141.         /* if 0 >= mid >= end, or 0 < mid < end, then use mid */        \
  142.         if (c01 != c12)                                                 \
  143.         {                                                               \
  144.             /* otherwise, we'll need to swap something to middle */     \
  145.             int z;                                                      \
  146.             a = &p[0];                                                  \
  147.             b = &p[n - 1];                                              \
  148.             c = COMPARE;                                                \
  149.             z = (c == c12) ? 0 : n - 1;                                 \
  150.             t = p[z];                                                   \
  151.             p[z] = p[m];                                                \
  152.             p[m] = t;                                                   \
  153.         }                                                               \
  154.         /* now p[m] is the median-of-three */                           \
  155.         /* swap it to the beginning so it won't move around */          \
  156.         t = p[0];                                                       \
  157.         p[0] = p[m];                                                    \
  158.         p[m] = t;                                                       \
  159.                                                                         \
  160.         /* partition loop */                                            \
  161.         i= 1;                                                           \
  162.         j= n - 1;                                                       \
  163.         for(;;)                                                         \
  164.         {                                                               \
  165.             b = &p[0];                                                  \
  166.             for (;;++i)                                                 \
  167.             {                                                           \
  168.                 a= &p[i];                                               \
  169.                 c = COMPARE;                                            \
  170.                 if (!c) break;                                          \
  171.             }                                                           \
  172.             a = &p[0];                                                  \
  173.             for (;;--j)                                                 \
  174.             {                                                           \
  175.                 b= &p[j];                                               \
  176.                 c = COMPARE;                                            \
  177.                 if (!c) break;                                          \
  178.             }                                                           \
  179.             /* make sure we haven't crossed */                          \
  180.             if (i >= j) break;                                          \
  181.             t = p[i];                                                   \
  182.             p[i] = p[j];                                                \
  183.             p[j] = t;                                                   \
  184.                                                                         \
  185.             ++i;                                                        \
  186.             --j;                                                        \
  187.         }                                                               \
  188.         /* recurse on smaller side, iterate on larger */                \
  189.         if (j < (n - i))                                                \
  190.         {                                                               \
  191.             RLT_(FUNCNAME,_quicksort)(p, j);                            \
  192.             p = p + i;                                                  \
  193.             n = n - i;                                                  \
  194.         }                                                               \
  195.         else                                                            \
  196.         {                                                               \
  197.             RLT_(FUNCNAME,_quicksort)(p+i, n-i);                        \
  198.             n = j;                                                      \
  199.         }                                                               \
  200.     }                                                                   \
  201. }                                                                       \
  202. MODE FUNCNAME(TYPE *p, int n)                                           \
  203. {                                                                       \
  204.     RLT_(FUNCNAME, _quicksort)(p, n);                                   \
  205.     RLT_(FUNCNAME, _insertsort)(p, n);                                  \
  206. }                                                                       \
  207.  
  208. #endif
  209.  
  210. // NOTE(rohan): start of implementation code
  211.  
  212. // NOTE(rohan): stretchy buffer
  213. #ifdef RLT_IMPLEMENTATION
  214.  
  215. void *buf__grow(const void *buf, usize new_len, usize elem_size)
  216. {
  217.     usize new_cap = rlt_max(1 + 2 * buf_cap(buf), new_len);
  218.     assert(new_len <= new_cap);
  219.     usize new_size = offsetof(BufHdr, buf) + (new_cap * elem_size);
  220.     BufHdr *new_hdr;
  221.     if (buf)
  222.     {
  223.         new_hdr = realloc(buf__hdr(buf), new_size);
  224.     }
  225.     else
  226.     {
  227.         new_hdr = malloc(new_size);
  228.         new_hdr->len = 0;
  229.     }
  230.  
  231.     new_hdr->cap = new_cap;
  232.     return new_hdr->buf;
  233. }
  234.  
  235. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement