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