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: 18508 $
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;
38 };
39 
40 /*
41     @brief ストレージに対する書き込みインターフェイス
42 */
43 class IStorageWriter
44 {
45 public:
46     virtual Result TryWrite(size_t* pOut, const void* buffer, size_t size) = 0;
47     virtual Result TrySetPosition(s64 position) = 0;
48     virtual Result TryGetPosition(s64* pOut) const = 0;
49     virtual Result TryGetSize(s64* pOut) const = 0;
50 };
51 
52 /*
53     @brief メモリストレージに対する読み込みインターフェイス
54 */
55 class MemoryStorageReader : public IStorageReader
56 {
57 private:
58     const char* m_Buffer;
59     size_t m_Size;
60     size_t m_Position;
61 public:
MemoryStorageReader(const void * buffer,size_t size)62     MemoryStorageReader(const void* buffer, size_t size) : m_Buffer(reinterpret_cast<const char*>(buffer)), m_Size(size), m_Position(0) {}
63     virtual Result TryRead(size_t* pOut, void* buffer, size_t size);
TrySetPosition(s64 position)64     virtual Result TrySetPosition(s64 position) { m_Position = static_cast<size_t>(position); return ResultSuccess(); }
TryGetPosition(s64 * pOut)65     virtual Result TryGetPosition(s64* pOut) const { *pOut = m_Position; return ResultSuccess(); }
TryGetSize(s64 * pOut)66     virtual Result TryGetSize(s64* pOut) const { *pOut = m_Size; return ResultSuccess(); }
67 };
68 
69 /*
70     @brief メモリストレージに対する書き込みインターフェイス
71 */
72 class MemoryStorageWriter : public IStorageWriter
73 {
74 private:
75     char* m_Buffer;
76     size_t m_Size;
77     size_t m_Position;
78 public:
MemoryStorageWriter(void * buffer,size_t size)79     MemoryStorageWriter(void* buffer, size_t size) : m_Buffer(reinterpret_cast<char*>(buffer)), m_Size(size), m_Position(0) {}
80     virtual Result TryWrite(size_t* pOut, const void* buffer, size_t size);
TrySetPosition(s64 position)81     virtual Result TrySetPosition(s64 position) { m_Position = static_cast<size_t>(position); return ResultSuccess(); }
TryGetPosition(s64 * pOut)82     virtual Result TryGetPosition(s64* pOut) const { *pOut = m_Position; return ResultSuccess(); }
TryGetSize(s64 * pOut)83     virtual Result TryGetSize(s64* pOut) const { *pOut = m_Size; return ResultSuccess(); }
84 };
85 
86 template <class Reader>
87 class StorageReaderTmeplate : public IStorageReader
88 {
89 private:
90     Reader& m_Impl;
91 public:
StorageReaderTmeplate(Reader & reader)92     StorageReaderTmeplate(Reader& reader) : m_Impl(reader) {}
TryRead(size_t * pOut,void * buffer,size_t size)93     virtual Result TryRead(size_t* pOut, void* buffer, size_t size) { return m_Impl.TryRead(pOut, buffer, size); }
TrySetPosition(s64 position)94     virtual Result TrySetPosition(s64 position) { return m_Impl.TrySetPosition(position); }
TryGetPosition(s64 * pOut)95     virtual Result TryGetPosition(s64* pOut) const { return m_Impl.TryGetPosition(pOut); }
TryGetSize(s64 * pOut)96     virtual Result TryGetSize(s64* pOut) const { return m_Impl.TryGetSize(pOut); }
97 };
98 
99 template <class Writer>
100 class StorageWriterTmeplate : public IStorageWriter
101 {
102 private:
103     Writer& m_Impl;
104 public:
StorageWriterTmeplate(Writer & writer)105     StorageWriterTmeplate(Writer& writer) : m_Impl(writer) {}
TryRead(size_t * pOut,void * buffer,size_t size)106     virtual Result TryRead(size_t* pOut, void* buffer, size_t size) { return m_Impl.TryRead(pOut, buffer, size); }
TrySetPosition(s64 position)107     virtual Result TrySetPosition(s64 position) { return m_Impl.TrySetPosition(position); }
TryGetPosition(s64 * pOut)108     virtual Result TryGetPosition(s64* pOut) const { return m_Impl.TryGetPosition(pOut); }
TryGetSize(s64 * pOut)109     virtual Result TryGetSize(s64* pOut) const { return m_Impl.TryGetSize(pOut); }
110 };
111 
112 }}
113 
114 #endif
115 
116 #endif
117