summaryrefslogtreecommitdiff
path: root/Homework/cs3460/smart_pointers/main.cpp
blob: 7ae7e718df3c249bcc7f787295123e628f1a948a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "shared_ptr.hpp"

#include <iostream>
#include <memory>
#include <string>

class MyClass
{
  public:
    MyClass() = default;
    MyClass(std::string name) :
        m_name(name) {}
    MyClass(std::string name, unsigned int rank) :
        m_name(name), m_rank(rank) {}
    MyClass(unsigned int rank, int) :
        // Not giving the second parameter a name to prevent a compiler warning
        m_rank(rank)
    {
    }

    void showMessage(std::string msg) { std::cout << msg << std::endl; }

    std::string m_name = "anonymous";
    unsigned int m_rank = 0;
};

void demoSharedPointer();

// ------------------------------------------------------------------
//
// Shared memory assignment: usu::shared_ptr usu::unique_ptr
//
// ------------------------------------------------------------------
int main()
{
    demoSharedPointer();

    return 0;
}

void demoSharedPointer()
{
    std::shared_ptr<int> p1 = std::make_shared<int>();
    usu::shared_ptr<int> p2 = usu::make_shared<int>();
    usu::shared_ptr<std::string> p2a = usu::make_shared<std::string>();

    std::shared_ptr<int> p3 = std::make_shared<int>(10);
    usu::shared_ptr<int> p4 = usu::make_shared<int>(10);

    std::shared_ptr<std::string> p5 = std::make_shared<std::string>();
    usu::shared_ptr<std::string> p6 = usu::make_shared<std::string>();
    usu::shared_ptr<std::string> p6b = usu::make_shared<std::string>("Hi Mom!");

    std::shared_ptr<MyClass> p7 = std::make_shared<MyClass>();
    usu::shared_ptr<MyClass> p8 = usu::make_shared<MyClass>();

    std::shared_ptr<MyClass> p9 = std::make_shared<MyClass>("Test");
    usu::shared_ptr<MyClass> p10 = usu::make_shared<MyClass>("Test");

    std::shared_ptr<MyClass> p11 = std::make_shared<MyClass>("Test", 2);
    usu::shared_ptr<MyClass> p12 = usu::make_shared<MyClass>("Test", 2);

    std::shared_ptr<MyClass> p13 = std::make_shared<MyClass>(1, 2);
    usu::shared_ptr<MyClass> p14 = usu::make_shared<MyClass>(1, 2);

    std::cout << std::endl;
    std::cout << "--- Reference Counts ---" << std::endl;

    std::cout << "p13 : " << p13.use_count() << std::endl;
    std::cout << "P14 : " << p14.use_count() << std::endl;

    auto p13b = p13;
    auto p14b = p14;

    std::cout << "auto p13b = p13" << std::endl;
    std::cout << "auto p14b = p14" << std::endl;

    std::cout << "p13 : " << p13.use_count() << std::endl;
    std::cout << "P14 : " << p14.use_count() << std::endl;

    p13b = p11;
    p14b = p12;

    std::cout << "auto p13b = p11" << std::endl;
    std::cout << "auto p14b = p12" << std::endl;

    std::cout << "p11 : " << p11.use_count() << std::endl;
    std::cout << "P12 : " << p12.use_count() << std::endl;
    std::cout << "p13b : " << p13b.use_count() << std::endl;
    std::cout << "P14b : " << p14b.use_count() << std::endl;

    std::cout << "p13 : " << p13.use_count() << std::endl;
    std::cout << "P14 : " << p14.use_count() << std::endl;

    std::cout << std::endl;
    std::cout << "--- Member Access ---" << std::endl;

    p13->showMessage("from p13");
    p14->showMessage("from p14");

    (*p13).showMessage("from (*p13)");
    (*p14).showMessage("from (*p14)");
    MyClass* x = p13.get();
    x->showMessage("from p13.get()");
    MyClass* y = p14.get();
    y->showMessage("from p14.get()");

    usu::shared_ptr<MyClass[]> a1 = usu::make_shared_array<MyClass, 4>();
    for (unsigned int i = 0; i < a1.size(); i++)
    {
        a1[i].showMessage("this is a test");
    }
}