There are several C++ concepts inside the Harlinn::Common::Core::IO namespace, describing features of I/O related classes and templates, enabling

StreamReader

template<typename T>
concept StreamReader = requires( T t, void* buffer, size_t count )
{
    { t.Read( buffer, count ) }->std::convertible_to<long long>;
};

StreamWriter

template<typename T>
concept StreamWriter = requires( T t, const void* constBuffer, size_t count )
{
    { t.Write( constBuffer, count ) }->std::convertible_to<long long>;
};

StreamPosition

template<typename T>
concept StreamPosition = requires( T t, long long position )
{
    { t.Position( ) }->std::convertible_to<long long>;
    { t.SetPosition( position ) };
};

StreamSize


template<typename T>
concept StreamSize = requires( T t, long long size )
{
    { t.Size( ) }->std::convertible_to<long long>;
    { t.SetSize( size ) };
};

StreamIO


template<typename T>
concept StreamIO = ( StreamReader<T> && StreamWriter<T> );

StreamSeek


template<typename T>
concept StreamSeek = requires( T t, long long offset, SeekOrigin seekOrigin )
{
    { t.Seek( offset, seekOrigin ) }->std::convertible_to<long long>;
};

StreamFeatureTests


template<typename T>
concept StreamFeatureTests = requires( T t )
{
    { t.CanRead( ) } ->std::convertible_to<bool>;
    { t.CanSeek( ) } ->std::convertible_to<bool>;
    { t.CanTimeout( ) } ->std::convertible_to<bool>;
    { t.CanWrite( ) } ->std::convertible_to<bool>;
};

StreamFlush


template<typename T>
concept StreamFlush = requires( T t )
{
    { t.Flush( ) };
};

StreamClone


template<typename T>
concept StreamClone = requires( T t )
{
    { t.Clone( ) } -> std::convertible_to<T>;
};