0022562: Helper C++/CLI class to encapsulate C++ classes
authorAGV <>
Tue, 20 Sep 2011 08:49:57 +0000 (08:49 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:30:18 +0000 (19:30 +0400)
src/NCollection/FILES
src/NCollection/NCollection_Haft.h [new file with mode: 0644]

index 799d7ec..71f73fe 100755 (executable)
@@ -77,3 +77,5 @@ NCollection_Handle.cxx
 
 NCollection_Comparator.hxx
 NCollection_QuickSort.hxx
+
+NCollection_Haft.h
diff --git a/src/NCollection/NCollection_Haft.h b/src/NCollection/NCollection_Haft.h
new file mode 100644 (file)
index 0000000..d44c134
--- /dev/null
@@ -0,0 +1,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;
+};