Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #define _CRT_SECURE_NO_WARNINGS
- #ifdef _inl_
- #undef _inl_
- #endif // !_inl_
- #ifdef MATRIX_NO_INLINE
- #define _inl_
- #else
- #define _inl_ inline
- #endif // !MATRIX_NO_INLINE
- #include <stdlib.h>
- #include <string.h>
- #include <stdbool.h>
- #include <assert.h>
- #include "type_cast.h"
- struct matrix_struct {
- size_t rows, cols, size;
- };
- typedef struct matrix_struct* matrix;
- #define DATA_OFFSET sizeof(struct matrix_struct)
- typedef enum matrix_errors_enum {
- NONE,
- MATRIX_IS_NOT_INITIALIZED,
- MATRIX_IS_ALREADY_INITIALIZED,
- MATRIX_INITIALIZATION_ERROR
- } MATRIX_ERRORS;
- _inl_ bool mat_is_valid(matrix _matrix) {
- return (_matrix && _matrix->cols && _matrix->rows && _matrix->size);
- }
- _inl_ matrix mat_create(const size_t rows, const size_t cols, const size_t size) {
- matrix result = (matrix)malloc(sizeof(struct matrix_struct) + (rows * cols * size));
- assert(result);
- result->rows = rows;
- result->cols = cols;
- result->size = size;
- return result;
- }
- _inl_ matrix mat_copy(const matrix _matrix) {
- matrix result = (matrix)malloc(sizeof(struct matrix_struct) + (_matrix->rows * _matrix->cols * _matrix->size));
- assert(result);
- memcpy(result, _matrix, sizeof(struct matrix_struct) + (_matrix->rows * _matrix->cols * _matrix->size));
- return result;
- }
- _inl_ void mat_set(const matrix _matrix, int value) {
- assert(_matrix);
- memset((unsigned char*)_matrix + DATA_OFFSET, value, _matrix->rows * _matrix->cols * _matrix->size);
- }
- _inl_ void mat_delete(matrix _matrix) {
- assert(!_matrix);
- free((void*)_matrix);
- }
- _inl_ void* at(const matrix _matrix, const size_t row, const size_t col) {
- return (void*)((unsigned char*)_matrix + DATA_OFFSET + (row * _matrix->cols * _matrix->size) + (col * _matrix->size));
- }
- _inl_ void* at_s(const matrix _matrix, const size_t row, const size_t col) {
- if (_matrix && (row < _matrix->rows) && (col < _matrix->cols))
- return (void*)((unsigned char*)_matrix + DATA_OFFSET + (row * _matrix->cols * _matrix->size) + (col * _matrix->size));
- }
- void mat_to_string(const matrix _matrix, void (*convert)(void*, char*)) {
- assert(_matrix);
- char buffer[256U];
- unsigned char* iter = (unsigned char*)_matrix + DATA_OFFSET;
- unsigned char* last = iter + (_matrix->rows * _matrix->cols * _matrix->size);
- for (; iter != last;) {
- for (; (long)last % (long)iter; iter += _matrix->size) {
- convert(iter, buffer);
- printf("%s", buffer);
- }
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement