Author:halw

Date:2008-12-01T22:45:08.000000Z


git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@112 abb3cda0-5349-4a8f-a601-0c33ac3a8c38
This commit is contained in:
halw
2008-12-01 22:45:08 +00:00
parent 7312cec21e
commit bba0936e07
11 changed files with 282 additions and 252 deletions

View File

@@ -108,19 +108,19 @@ For example, a C++ function
should have the Eiffel counterpart
<code>
cpp_add (obj: POINTER; new_int: INTEGER) is
-- Encapsulation of member function add.
external
"C++ [IntArray %"intarray.h%"] (IntArray *, int)"
end
cpp_add (obj: POINTER; new_int: INTEGER)
-- Encapsulation of member function add.
external
"C++ [IntArray %"intarray.h%"] (IntArray *, int)"
end
</code>
This scheme, however, is often inconvenient because it forces the Eiffel side to work on objects in a non-object-oriented way. (The object-oriented way treats the current object, within a class, as implicit.) A better approach, used by Legacy++, is to make a feature such as cpp_add secret, and to export a feature whose signature corresponds to that of the original C++ function, with no extra object argument; that feature will use a secret attribute object_ptr to access the object. In the example this will give the feature
<code>
add (new_int: INTEGER) is
-- Encapsulation of member function add.
do
cpp_add (object_ptr, new_int)
end
add (new_int: INTEGER)
-- Encapsulation of member function add.
do
cpp_add (object_ptr, new_int)
end
</code>
where ''object_ptr'' is a secret attribute of type <eiffel>POINTER</eiffel>, initialized by the creation procedures of the class. To the Eiffel developer, <eiffel>add</eiffel> looks like a normal object-oriented feature, which takes only the expected argument. Further examples appear below. This technique only works of course when the C++ object is implicit in the context of the Eiffel class.
@@ -198,101 +198,101 @@ class IntArray {
Here is the result of applying Legacy++ to that class, which will serve as an illustration of both the C++ interface mechanisms and Legacy++:
<code>
indexing
description: "Eiffel encapsulation of C++ class IntArray";
date: "$Date: 2006-10-12 03:18:50 +0200 (Thu, 12 Oct 2006) $";
revision: "$Revision: 64319 $"
description: "Eiffel encapsulation of C++ class IntArray";
date: "$Date: 2006-10-12 03:18:50 +0200 (Thu, 12 Oct 2006) $";
revision: "$Revision: 64319 $"
class
INTARRAY
INTARRAY
inherit
MEMORY
redefine
dispose
end
MEMORY
redefine
dispose
end
create
make
make
feature -- Initialization
make (size: INTEGER) is
-- Create Eiffel and C++ objects.
do
object_ptr := cpp_new (size)
end
make (size: INTEGER)
-- Create Eiffel and C++ objects.
do
object_ptr := cpp_new (size)
end
feature-- Removal
dispose is
-- Delete C++ object.
do
cpp_delete (object_ptr)
end
dispose
-- Delete C++ object.
do
cpp_delete (object_ptr)
end
feature
output is
-- Call C++ counterpart.
do
cpp_output (object_ptr)
end
output
-- Call C++ counterpart.
do
cpp_output (object_ptr)
end
add (new_int: INTEGER) is
-- Call C++ counterpart.
do
cpp_add (object_ptr, new_int)
end
add (new_int: INTEGER)
-- Call C++ counterpart.
do
cpp_add (object_ptr, new_int)
end
feature {INTARRAY}
underscore_integers: POINTER is
-- Value of corresponding C++ data member.
do
Result := underscore_integers (object_ptr)
end
underscore_integers: POINTER
-- Value of corresponding C++ data member.
do
Result := underscore_integers (object_ptr)
end
feature {NONE} -- Externals
cpp_new (size: INTEGER): POINTER is
-- Call single constructor of C++ class.
external
"C++ [new IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
end
cpp_new (size: INTEGER): POINTER
-- Call single constructor of C++ class.
external
"C++ [new IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
end
cpp_delete (cpp_obj: POINTER) is
-- Call C++ destructor on C++ object.
external
"C++ [delete IntArray %"INTARRAY.H%"] ()"
end
cpp_delete (cpp_obj: POINTER)
-- Call C++ destructor on C++ object.
external
"C++ [delete IntArray %"INTARRAY.H%"] ()"
end
cpp_output (cpp_obj: POINTER) is
-- Call C++ member function.
external
"C++ [IntArray %"INTARRAY.H%"] ()"
alias
"output"
end
cpp_output (cpp_obj: POINTER)
-- Call C++ member function.
external
"C++ [IntArray %"INTARRAY.H%"] ()"
alias
"output"
end
cpp_add (cpp_obj: POINTER; new_int: INTEGER) is
-- Call C++ member function.
external
"C++ [IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
alias
"add"
end
cpp_add (cpp_obj: POINTER; new_int: INTEGER)
-- Call C++ member function.
external
"C++ [IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
alias
"add"
end
cpp_underscore_integers (cpp_obj: POINTER): POINTER is
-- Value of C++ data member
external
"C++ [data_member IntArray %"INTARRAY.H%"]: EIF_POINTER"
alias
"_integers"
end
cpp_underscore_integers (cpp_obj: POINTER): POINTER
-- Value of C++ data member
external
"C++ [data_member IntArray %"INTARRAY.H%"]: EIF_POINTER"
alias
"_integers"
end
feature {NONE} -- Implementation
object_ptr: POINTER
object_ptr: POINTER
end -- class INTARRAY
</code>

View File

@@ -30,7 +30,7 @@ extern size_t one_param_return(FILE *f);</code>
Here is the corresponding Eiffel code:
<code>
c_no_param is
c_no_param
-- Encapsulation of a C routine with no parameter.
external
"C | %"my_header.h%""
@@ -38,7 +38,7 @@ Here is the corresponding Eiffel code:
"no_param"
end
c_one_param (i: INTEGER) is
c_one_param (i: INTEGER)
-- Encapsulation of a C routine with one parameter.
external
"C (int) | %"my_header.h%""
@@ -46,7 +46,7 @@ Here is the corresponding Eiffel code:
"one_param"
end
c_no_param_return: INTEGER is
c_no_param_return: INTEGER
-- Encapsulation of a C routine with no parameter
-- returning an INTEGER
external
@@ -55,7 +55,7 @@ Here is the corresponding Eiffel code:
"no_param_return"
end
c_one_param_return (p: POINTER): INTEGER is
c_one_param_return (p: POINTER): INTEGER
-- Encapsulation of a C routine with one parameter
-- returning an INTEGER
external
@@ -82,7 +82,7 @@ Then, the corresponding Eiffel code will look like:
<code>
menu_id: INTEGER is
menu_id: INTEGER
-- `ID_MENU' C encapsulation.
external
"C [macro %"my_header.h%"] : EIF_INTEGER"
@@ -90,7 +90,7 @@ Then, the corresponding Eiffel code will look like:
"ID_MENU"
end
menu_id_character: CHARACTER is
menu_id_character: CHARACTER
-- `ID_MENU_CHARACTER' C encapsulation.
external
"C [macro %"my_header.h%"] : EIF_CHARACTER"
@@ -98,7 +98,7 @@ Then, the corresponding Eiffel code will look like:
"ID_MENU_CHARACTER"
end
i_th (p: POINTER; i: INTEGER): INTEGER is
i_th (p: POINTER; i: INTEGER): INTEGER
-- Access the `i'-th element of `p', array of C EIF_INTEGER.
external
"C [macro %"my_header.h%"] (EIF_INTEGER *, EIF_INTEGER): EIF_INTEGER"
@@ -125,7 +125,7 @@ typdef struct point {
Then, the corresponding Eiffel code will look like:
<code>
x (p: POINTER): INTEGER is
x (p: POINTER): INTEGER
-- Access field x of struct pointed by `p'.
external
"C [struct %"my_header.h%"] (Point): EIF_INTEGER"
@@ -133,7 +133,7 @@ Then, the corresponding Eiffel code will look like:
"x"
end
y (p: POINTER): INTEGER is
y (p: POINTER): INTEGER
-- Access field y of struct pointed by `p'.
external
"C [struct %"my_header.h%"] (Point): EIF_INTEGER"
@@ -141,7 +141,7 @@ Then, the corresponding Eiffel code will look like:
"y"
end
set_x (p: POINTER; v: INTEGER) is
set_x (p: POINTER; v: INTEGER)
-- Set field x of struct pointed by `p'.
external
"C [struct %"my_header.h%"] (Point, int)"
@@ -149,7 +149,7 @@ Then, the corresponding Eiffel code will look like:
"x"
end
set_y (p: POINTER: v: INTEGER) is
set_y (p: POINTER: v: INTEGER)
-- Set field y of struct pointed by `p' with `v'.
external
"C [struct %"my_header.h%"] (Point, int)"
@@ -171,13 +171,13 @@ Therefore if you want to call an external routine defined in a DLL supposed to b
<code>
my_cdecl_routine (a: INTEGER): POINTER is
my_cdecl_routine (a: INTEGER): POINTER
-- Encapsulation of a dll function with the `_cdecl' call mechanism.
external
"C [dll32 %"my_dll.dll%"] (int): EIF_POINTER"
end
my_stdcall_routine (a: INTEGER): POINTER is
my_stdcall_routine (a: INTEGER): POINTER
-- Encapsulation of a dll function with the `_stdcall' call mechanism.
external
"C [dllwin32 %"my_dll.dll%"] (int): EIF_POINTER"
@@ -207,7 +207,7 @@ In WEL, the encapsulation is written as:
<code>
cwin_send_message (hwnd: POINTER; msg, wparam, param: INTEGER) is
cwin_send_message (hwnd: POINTER; msg, wparam, param: INTEGER)
-- SDK SendMessage (without the result)
external
"C [macro %"wel.h%"] (HWND, UINT, WPARAM, LPARAM)"