1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: main.cpp
4
5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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 $Revision: 13145 $
14 *---------------------------------------------------------------------------*/
15
16 //------------------------------------------------------------------
17 // デモ: SharedPtr
18 //
19 // 概要
20 // nw::ut::SharedPtr クラスのデモです。
21 // テンプレート引数に LockObject を指定するスレッドセーフ版と、
22 // デフォルトの非スレッドセーフ版の SharedPtr を作成します。
23 //------------------------------------------------------------------
24
25 #include <nn.h>
26
27 #include <nw/ut/ut_SharedPtr.h>
28 #include <nw/demo/demo_SimpleApp.h>
29
30 #include <nw/sdk.h>
31
32 // クラスBase
33 class Base
34 {
35 public:
~Base()36 virtual ~Base() {}
37 };
38
39 // クラスAAA
40 class AAA : public Base
41 {
42 public:
~AAA()43 virtual ~AAA()
44 {
45 NW_LOG("destruct AAA\n");
46 }
47 };
48
49 // クラスBBB
50 class BBB : public Base
51 {
52 public:
~BBB()53 virtual ~BBB()
54 {
55 NW_LOG("destruct BBB\n");
56 }
57 };
58
59 /*---------------------------------------------------------------------------*
60 Name: main
61
62 Description: サンプルのメイン関数です。
63
64 Arguments: なし。
65
66 Returns: なし。
67 *---------------------------------------------------------------------------*/
68 void
nnMain(void)69 nnMain( void )
70 {
71 nw::demo::DemoAllocator allocator;
72
73 nn::os::Initialize();
74 nw::demo::InitializeDemoMemory();
75 nw::demo::InitializeDemoAllocator(&allocator, nw::demo::DEMO_MEMORY_SIZE, nn::os::ALLOCATE_OPTION_LINEAR);
76
77 nw::ut::WeakPtr<AAA> pWeakAAA;
78 nw::ut::WeakPtr<Base, nw::os::LockObject> pWeakBase;
79 nw::ut::SharedPtr<Base> pBaseA;
80
81 {
82 AAA* objA = new(allocator.Alloc(sizeof(AAA))) AAA();
83 BBB* objB = new(allocator.Alloc(sizeof(BBB))) BBB();
84
85 nw::ut::SharedPtr<AAA> pAAA = nw::ut::SharedPtr<AAA>( objA, &allocator );
86 nw::ut::SharedPtr<BBB, nw::os::LockObject> pBBB = nw::ut::SharedPtr<BBB, nw::os::LockObject>( objB, &allocator );
87 nw::ut::WeakPtr<BBB, nw::os::LockObject> pWeakBBB;
88
89 // pWeakBase = pAAA; // Error! 排他方式の違うものへの代入はコンパイルエラー。
90
91 pBaseA = pAAA;
92 pWeakAAA = pAAA;
93 pWeakBBB = pBBB;
94 pWeakBase = pWeakBBB;
95
96 if (pAAA == pBaseA)
97 {
98 NW_LOG("pAAA == pBaseA\n");
99 }
100
101 if (pBaseA == pWeakAAA.Lock())
102 {
103 NW_LOG("pBaseA == pWeakAAA\n");
104 }
105
106 if (pBBB == pWeakBBB.Lock())
107 {
108 NW_LOG("pBBB == pWeakBBB\n");
109 }
110
111 if (pBBB == pWeakBase.Lock())
112 {
113 NW_LOG("pBBB == pWeakBase\n");
114 }
115
116 if (pWeakBBB.Lock() == pWeakBase.Lock())
117 {
118 NW_LOG("pWeakBBB == pWeakBase\n");
119 }
120 }
121
122 if ( pWeakAAA.Lock() )
123 {
124 NW_LOG("AAA is not released\n");
125 }
126 else
127 {
128 NW_LOG("AAA is already released\n");
129 }
130
131 if ( pWeakBase.Lock() )
132 {
133 NW_LOG("BBB is not released\n");
134 }
135 else
136 {
137 NW_LOG("BBB is already released\n");
138 }
139
140 OS_Exit(0);
141 }
142
143
144
145