12#ifndef CMSIS_PLUS_POSIX_IO_BLOCK_DEVICE_PARTITION_H_
13#define CMSIS_PLUS_POSIX_IO_BLOCK_DEVICE_PARTITION_H_
17#if defined(__cplusplus)
21#if defined(OS_USE_OS_APP_CONFIG_H)
22#include <cmsis-plus/os-app-config.h>
29#pragma GCC diagnostic push
31#pragma clang diagnostic ignored "-Wc++98-compat"
42 class block_device_partition_impl;
111#pragma GCC diagnostic push
112#if defined(__clang__)
113#pragma clang diagnostic ignored "-Wpadded"
114#elif defined(__GNUC__)
115#pragma GCC diagnostic ignored "-Wpadded"
167 do_vioctl (
int request, std::va_list args)
override;
170 do_vopen (
const char* path,
int oflag, std::va_list args)
override;
177 std::size_t nblocks)
override;
202 blknum_t partition_offset_blocks_ = 0;
209#pragma GCC diagnostic pop
213 template <
typename T = block_device_partition_impl>
229 template <
typename... Args>
294 template <
typename T,
typename L>
311 template <
typename... Args>
349 vioctl (
int request, std::va_list args)
override;
353 std::size_t nblocks = 1)
override;
357 std::size_t nblocks = 1)
override;
387#pragma GCC diagnostic push
388#if defined(__clang__)
389#pragma clang diagnostic ignored "-Wweak-template-vtables"
392#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
398#pragma GCC diagnostic pop
412 inline block_device_partition_impl&
420 template <
typename T>
421 template <
typename... Args>
423 T>::block_device_partition_implementable (
const char* name,
427 impl_instance_{ parent,
std::forward<Args> (args)... }
429#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
430 trace::printf (
"block_device_partition_implementable::%s(\"%s\")=@%p\n",
431 __func__, name_,
this);
435 template <
typename T>
437 T>::~block_device_partition_implementable ()
439#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
440 trace::printf (
"block_device_partition_implementable::%s() @%p %s\n",
441 __func__,
this, name_);
445 template <
typename T>
454 template <
typename T,
typename L>
455 template <
typename... Args>
460 impl_instance_{ parent,
std::forward<Args> (args)... },
463#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
464 trace::printf (
"block_device_partition_lockable::%s(\"%s\")=@%p\n",
465 __func__, name_,
this);
469 template <
typename T,
typename L>
472#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
473 trace::printf (
"block_device_partition_lockable::%s() @%p %s\n",
474 __func__,
this, name_);
480 template <
typename T,
typename L>
485#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
486 trace::printf (
"block_device_partition_lockable::%s(%d) @%p\n", __func__,
490 std::lock_guard<L> lock{ locker_ };
495 template <
typename T,
typename L>
501#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
502 trace::printf (
"block_device_partition_lockable::%s(%p, %u, %u) @%p\n",
503 __func__, buf, blknum, nblocks,
this);
506 std::lock_guard<L> lock{ locker_ };
511 template <
typename T,
typename L>
517#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE_PARTITION)
518 trace::printf (
"block_device_partition_lockable::%s(%p, %u, %u) @%p\n",
519 __func__, buf, blknum, nblocks,
this);
522 std::lock_guard<L> lock{ locker_ };
527 template <
typename T,
typename L>
538#pragma GCC diagnostic pop
block_device::blknum_t blknum_t
virtual int do_vopen(const char *path, int oflag, std::va_list args) override
virtual int do_close(void) override
virtual ~block_device_partition_impl() override
virtual void do_sync(void) override
friend block_device_partition
virtual int do_vioctl(int request, std::va_list args) override
virtual ssize_t do_write_block(const void *buf, blknum_t blknum, std::size_t nblocks) override
void configure(blknum_t offset, blknum_t nblocks)
virtual ssize_t do_read_block(void *buf, blknum_t blknum, std::size_t nblocks) override
virtual ~block_device_partition_implementable() override
value_type & impl(void) const
virtual ssize_t read_block(void *buf, blknum_t blknum, std::size_t nblocks=1) override
block_device_partition_lockable(const char *name, block_device &parent, lockable_type &locker, Args &&... args)
virtual ssize_t write_block(const void *buf, blknum_t blknum, std::size_t nblocks=1) override
virtual ~block_device_partition_lockable() override
virtual int vioctl(int request, std::va_list args) override
value_type & impl(void) const
Block device partition class.<cmsis-plus/posix-io/block-device-partitions.h>
block_device_partition_impl & impl(void) const
virtual ~block_device_partition() override
void configure(blknum_t offset, blknum_t nblocks)
virtual int vioctl(int request, std::va_list args) override
virtual ssize_t read_block(void *buf, blknum_t blknum, std::size_t nblocks=1)
virtual ssize_t write_block(const void *buf, blknum_t blknum, std::size_t nblocks=1)
const char * name(void) const
int printf(const char *format,...)
Write a formatted string to the trace device.