#ifndef LIP_MISC_DATA_COPY_H
#define LIP_MISC_DATA_COPY_H

/***************************************************************************//**
 @defgroup lip_misc_data_copy Функции копирования данных
 @ingroup  lip_misc
 @brief Стандартные функции для копирования данных

    Данный модуль содержит объявление типа функции копирования данных, а также
    несколько готовых реализаций.

    Другие модули стека могут реализовать возможность назначения пользовательской
    функции для копирования данных на случай, если  есть какие-то ограничения
    на способ копирования данных из-за особенностей памяти или для увеличения
    производительности.

    Для назначения должен использоваться тип #t_lip_data_copy_func для функции
    копирования, а также должна быть возможность передать пользователю указатель
    на свой контекст, который будет передаваться при каждом вызове функции.

    В этом случае пользователь может как назначить одну из реализованных в этом
    модуле стандартных функций, так свою собственную.
*******************************************************************************/


/***************************************************************************//**
 @addtogroup lip_misc_data_copy
 @{
 @file lip_misc_data_copy.h
 @brief Файл содержит тип и определения стандартных функций копирования данных
 @author Borisov Alexey <borisov@lcard.ru>
*******************************************************************************/

#include "lip/lip_defs.h"
/***************************************************************************//**
 *  Тип функции для пользовательского копирования данных
 *    @param[in] dest   Указатель на память назначения, куда должны быть скопированы данные
 *    @param[in] src    Указатель на память откуда должны быть скопированы данные
 *    @param[in] size   Размер копируемых данных в байтах
 *    @param[in] ctx    Указатель на пользовательский контекст, переданный при назначении функции
 ***********************************************************************************************/
typedef void (*t_lip_data_copy_func)(void *dest, const void *src, size_t size, void *ctx);

/** @brief Стандартный вариант копирования через memcpy */
void lip_data_copy_memcpy(void *dest, const void *src, size_t size, void *ctx);
/** Вариант копирования данных, который выполняет обращения к памяти назначения
 *  только 16-битными словами */
void lip_data_copy_dest_rw16(void *dest, const void *src, size_t size, void *ctx);
/** Вариант копирования данных, который выполняет обращения к памяти назначения
 *  только 32-битными словами */
void lip_data_copy_dest_rw32(void *dest, const void *src, size_t size, void *ctx);


/** @}*/

#endif // LIP_MISC_DATA_COPY_H
