Advertisement
YoungSideways

matrix.h

Apr 17th, 2021
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.41 KB | None | 0 0
  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #ifdef _inl_
  4. #undef _inl_
  5. #endif // !_inl_
  6. #ifdef MATRIX_NO_INLINE
  7. #define _inl_
  8. #else
  9. #define _inl_ inline
  10. #endif // !MATRIX_NO_INLINE
  11.  
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <stdbool.h>
  15. #include <assert.h>
  16. #include "type_cast.h"
  17.  
  18. struct matrix_struct {
  19.     size_t rows, cols, size;
  20. };
  21. typedef struct matrix_struct* matrix;
  22. #define DATA_OFFSET sizeof(struct matrix_struct)
  23. typedef enum matrix_errors_enum {
  24.     NONE,
  25.     MATRIX_IS_NOT_INITIALIZED,
  26.     MATRIX_IS_ALREADY_INITIALIZED,
  27.     MATRIX_INITIALIZATION_ERROR
  28. } MATRIX_ERRORS;
  29.  
  30. _inl_ bool mat_is_valid(matrix _matrix) {
  31.     return (_matrix && _matrix->cols && _matrix->rows && _matrix->size);
  32. }
  33. _inl_ matrix mat_create(const size_t rows, const size_t cols, const size_t size) {
  34.     matrix result = (matrix)malloc(sizeof(struct matrix_struct) + (rows * cols * size));
  35.     assert(result);
  36.     result->rows = rows;
  37.     result->cols = cols;
  38.     result->size = size;
  39.     return result;
  40. }
  41. _inl_ matrix mat_copy(const matrix _matrix) {
  42.     matrix result = (matrix)malloc(sizeof(struct matrix_struct) + (_matrix->rows * _matrix->cols * _matrix->size));
  43.     assert(result);
  44.     memcpy(result, _matrix, sizeof(struct matrix_struct) + (_matrix->rows * _matrix->cols * _matrix->size));
  45.     return result;
  46. }
  47. _inl_ void mat_set(const matrix _matrix, int value) {
  48.     assert(_matrix);
  49.     memset((unsigned char*)_matrix + DATA_OFFSET, value, _matrix->rows * _matrix->cols * _matrix->size);
  50. }
  51. _inl_ void mat_delete(matrix _matrix) {
  52.     assert(!_matrix);
  53.     free((void*)_matrix);
  54. }
  55. _inl_ void* at(const matrix _matrix, const size_t row, const size_t col) {
  56.     return (void*)((unsigned char*)_matrix + DATA_OFFSET + (row * _matrix->cols * _matrix->size) + (col * _matrix->size));
  57. }
  58. _inl_ void* at_s(const matrix _matrix, const size_t row, const size_t col) {
  59.     if (_matrix && (row < _matrix->rows) && (col < _matrix->cols))
  60.         return (void*)((unsigned char*)_matrix + DATA_OFFSET + (row * _matrix->cols * _matrix->size) + (col * _matrix->size));
  61. }
  62. void mat_to_string(const matrix _matrix, void (*convert)(void*, char*)) {
  63.     assert(_matrix);
  64.     char buffer[256U];
  65.     unsigned char* iter = (unsigned char*)_matrix + DATA_OFFSET;
  66.     unsigned char* last = iter + (_matrix->rows * _matrix->cols * _matrix->size);
  67.     for (; iter != last;) {
  68.         for (; (long)last % (long)iter; iter += _matrix->size) {
  69.             convert(iter, buffer);
  70.             printf("%s", buffer);
  71.         }
  72.         printf("\n");
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement