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
#include <iostream>
#include "stack.hpp"

void
foo(Stack *ret)
{
    Stack stack; Stack_construct_default(&stack);
    Stack_push(&stack11);
    Stack_push(&stack22);
    Stack_push(&stack33);

    Stack_construct_swap(ret, &stack);
    Stack_destruct(&stack);
}

int
main()
{
    Stack   stack; Stack_construct_default(&stack);

    Stack_push(&stack1.1);
    Stack_push(&stack2.2);
    Stack_push(&stack3.3);

    Stack_print(&stack"stack:");

    Stack  stack2;  Stack_construct_copy(&stack2, &stack);

    Stack  stack3;  Stack_construct_default(&stack3);

    // stack3 = stack2
    {
        Stack tmp;  Stack_construct_copy(&tmp, &stack2);
        Stack_assign(&stack3, &tmp);
        Stack_destruct(&tmp);
    }

    std::cout << "pop from stack 2: " << Stack_pop(&stack2) << std::endl;

    Stack_print(&stack2"stack2:");
    Stack_print(&stack3"stack3:");


    // foo();
    {
        Stack tmp;  Stack_construct_default(&tmp);
        foo(&tmp);
        Stack_destruct(&tmp);
    }

    Stack  stack4;  Stack_construct_default(&stack4);
    // stack4 = foo();
    {
        Stack tmp;  Stack_construct_default(&tmp);
        foo(&tmp);
        Stack_assign(&stack4, &tmp);
        Stack_destruct(&tmp);
    }
    Stack_print(&stack4"stack4:");

    // Stack stack5 = foo();
    Stack  stack5;  Stack_construct_default(&stack5);
    {
        foo(&stack5);
    }
    Stack_print(&stack5"stack5:");


    Stack_destruct(&stack4);
    Stack_destruct(&stack3);
    Stack_destruct(&stack2);
    Stack_destruct(&stack);
}