summaryrefslogtreecommitdiff
path: root/inc/NCollection_Haft.h
blob: d44c13470237171ba8fb0a9d5b2d12f39d2a17cc (plain)
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
// File:      NCollection_Haft.h
// Created:   02.06.11 08:12:42
// Author:    Andrey BETENEV
// Copyright: OPEN CASCADE SAS 2011

#if ! defined(_MSC_VER) || ! defined(_MANAGED)
#error This file is usable only in C++/CLI (.NET) programs
#endif

#pragma once

using namespace System;
using namespace System::Collections::Generic;

//! Template CLI class providing the way to encapsulate instance of C++ 
//! class as a field in the C++/CLI (ref) class. 
//!
//! It can be helpful to encapsulate OCCT Handles, maps, arrays, etc.
//!
//! Use of variable of the Haft type is very similar to that of encapsulated 
//! class:
//! - Default constructor creates default-constructed C++ instance
//! - Non-default construction is possible by copy or by initialization from
//!   compatible pointer (e.g. Haft for Handle can be initialized by pointer 
//!   returned by operator new for a handled class)
//! - Underlying C++ instance is accessed by operator ()

template <class CPPClass> 
public ref class NCollection_Haft 
{
public:
  //! Initialize CLI Haft object by default-constructed C++ object
  NCollection_Haft ()
  {
    myPtr = new CPPClass;
  }

  //! Initialize CLI Haft object by compatible C++ pointer
  template <class T>
  NCollection_Haft (const T* aPtr)
  {
    myPtr = new CPPClass (aPtr);
  }

  //! Initialize CLI Haft object by C++ class object
  NCollection_Haft (const CPPClass& aPtr)
  {
    myPtr = new CPPClass (aPtr);
  }

  //! Destructor - invoked explicitly by delete, or automatically 
  //! when local variable is scoped out
  ~NCollection_Haft ()
  {
    this->Nullify();
  }

  //! Finalizer - called undeterministically by garbage collector
  !NCollection_Haft ()
  {
    this->Nullify();
  }

  //! Function call operator is provided to access underlying C++ object
  CPPClass& operator () () { return *myPtr; }

protected:
  //! Invalidate the haft
  void Nullify ()
  {
    delete myPtr;
    myPtr = 0;
  }

protected:
  CPPClass* myPtr;
};