1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fnd_Storage.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 30369 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FND_STORAGE_H_
17 #define NN_FND_STORAGE_H_
18 
19 #include <nn/types.h>
20 #include <nn/config.h>
21 #include <nn/Result.h>
22 #include <nn/assert.h>
23 
24 #ifdef __cplusplus
25 
26 namespace nn { namespace fnd {
27 
28 /*
29     @brief ストレージに対する読み込みインターフェイス
30 */
31 class IStorageReader
32 {
33 public:
34     virtual Result TryRead(size_t* pOut, void* buffer, size_t size) = 0;
35     virtual Result TrySetPosition(s64 position) = 0;
36     virtual Result TryGetPosition(s64* pOut) const = 0;
37     virtual Result TryGetSize(s64* pOut) const = 0;
~IStorageReader()38     virtual ~IStorageReader() {}
39 };
40 
41 /*
42     @brief ストレージに対する書き込みインターフェイス
43 */
44 class IStorageWriter
45 {
46 public:
47     virtual Result TryWrite(size_t* pOut, const void* buffer, size_t size) = 0;
48     virtual Result TrySetPosition(s64 position) = 0;
49     virtual Result TryGetPosition(s64* pOut) const = 0;
50     virtual Result TryGetSize(s64* pOut) const = 0;
~IStorageWriter()51     virtual ~IStorageWriter() {}
52 };
53 
54 /*
55     @brief メモリストレージに対する読み込みインターフェイス
56 */
57 class MemoryStorageReader : public IStorageReader
58 {
59 private:
60     const char* m_Buffer;
61     size_t m_Size;
62     size_t m_Position;
63 public:
MemoryStorageReader(const void * buffer,size_t size)64     MemoryStorageReader(const void* buffer, size_t size) : m_Buffer(reinterpret_cast<const char*>(buffer)), m_Size(size), m_Position(0) {}
65     virtual Result TryRead(size_t* pOut, void* buffer, size_t size);
TrySetPosition(s64 position)66     virtual Result TrySetPosition(s64 position) { m_Position = static_cast<size_t>(position); return ResultSuccess(); }
TryGetPosition(s64 * pOut)67     virtual Result TryGetPosition(s64* pOut) const { *pOut = m_Position; return ResultSuccess(); }
TryGetSize(s64 * pOut)68     virtual Result TryGetSize(s64* pOut) const { *pOut = m_Size; return ResultSuccess(); }
69 };
70 
71 /*
72     @brief メモリストレージに対する書き込みインターフェイス
73 */
74 class MemoryStorageWriter : public IStorageWriter
75 {
76 private:
77     char* m_Buffer;
78     size_t m_Size;
79     size_t m_Position;
80 public:
MemoryStorageWriter(void * buffer,size_t size)81     MemoryStorageWriter(void* buffer, size_t size) : m_Buffer(reinterpret_cast<char*>(buffer)), m_Size(size), m_Position(0) {}
82     virtual Result TryWrite(size_t* pOut, const void* buffer, size_t size);
TrySetPosition(s64 position)83     virtual Result TrySetPosition(s64 position) { m_Position = static_cast<size_t>(position); return ResultSuccess(); }
TryGetPosition(s64 * pOut)84     virtual Result TryGetPosition(s64* pOut) const { *pOut = m_Position; return ResultSuccess(); }
TryGetSize(s64 * pOut)85     virtual Result TryGetSize(s64* pOut) const { *pOut = m_Size; return ResultSuccess(); }
86 };
87 
88 template <class Reader>
89 class StorageReaderTmeplate : public IStorageReader
90 {
91 private:
92     Reader& m_Impl;
93 public:
StorageReaderTmeplate(Reader & reader)94     StorageReaderTmeplate(Reader& reader) : m_Impl(reader) {}
TryRead(size_t * pOut,void * buffer,size_t size)95     virtual Result TryRead(size_t* pOut, void* buffer, size_t size) { return m_Impl.TryRead(pOut, buffer, size); }
TrySetPosition(s64 position)96     virtual Result TrySetPosition(s64 position) { return m_Impl.TrySetPosition(position); }
TryGetPosition(s64 * pOut)97     virtual Result TryGetPosition(s64* pOut) const { return m_Impl.TryGetPosition(pOut); }
TryGetSize(s64 * pOut)98     virtual Result TryGetSize(s64* pOut) const { return m_Impl.TryGetSize(pOut); }
99 };
100 
101 template <class Writer>
102 class StorageWriterTmeplate : public IStorageWriter
103 {
104 private:
105     Writer& m_Impl;
106 public:
StorageWriterTmeplate(Writer & writer)107     StorageWriterTmeplate(Writer& writer) : m_Impl(writer) {}
TryRead(size_t * pOut,void * buffer,size_t size)108     virtual Result TryRead(size_t* pOut, void* buffer, size_t size) { return m_Impl.TryRead(pOut, buffer, size); }
TrySetPosition(s64 position)109     virtual Result TrySetPosition(s64 position) { return m_Impl.TrySetPosition(position); }
TryGetPosition(s64 * pOut)110     virtual Result TryGetPosition(s64* pOut) const { return m_Impl.TryGetPosition(pOut); }
TryGetSize(s64 * pOut)111     virtual Result TryGetSize(s64* pOut) const { return m_Impl.TryGetSize(pOut); }
112 };
113 
114 }}
115 
116 #endif
117 
118 #endif
119