Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > type casting of a ptr to a c struct

Reply
Thread Tools

type casting of a ptr to a c struct

 
 
Chandra Shekhar Kumar
Guest
Posts: n/a
 
      06-24-2003
polymorphic_cast<> of the boost library might help better.

 
Reply With Quote
 
 
 
 
Cgacc20
Guest
Posts: n/a
 
      06-25-2003
I have a c struct from old code that cannot be modified and I am trying to
write a wrapper C++ class around it.
This class is often passed as a pointer to some c functions of a library and I
wanted to keep my new class transparent and compatible with those functions.
That is, when using the code, I should be able to do either:
oldVector xyz;
function( &xyz );

myVector xyz;
function( &xyz );

My original implementation solved the issue using inheritance. That is, in
pseudo code:

// old code
typedef struct {float x, y, z;} oldVector;

/// my class
class myVector : public oldVector
{
/// new methods here
};

This worked fine for my needs, but I wanted to change myVector class to be a
template which would likely prevent the inheritance.

I know the alignment in the compilers I will be should result in an identical
memory layout.
I was wondering if it was possible to use type casting to work around it.

Basically, I was thinking something along the lines of:

template <class T> class Vec3
{
public:
T x, y, z;
// other methods....
};

class myVector : public Vec3< float >
{
operator oldVector();

// but for a pointer.... would this be valid????
operator *oldVector();
};


Would this be valid, or terrible ideas so far and something else is likely
better?
 
Reply With Quote
 
 
 
 
John Carson
Guest
Posts: n/a
 
      06-25-2003
"John Carson" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)
>
> #include <iostream>


An anomaly resulting from some late editing. It should be

#include <cstdio>



--
John Carson
1. To reply to email address, remove donald
2. Don't reply to email address (post here instead)
 
Reply With Quote
 
Rob Williscroft
Guest
Posts: n/a
 
      06-25-2003
Cgacc20 wrote in news:(E-Mail Removed):

> I have a c struct from old code that cannot be modified and I am
> trying to write a wrapper C++ class around it.
> This class is often passed as a pointer to some c functions of a
> library and I wanted to keep my new class transparent and compatible
> with those functions. That is, when using the code, I should be able
> to do either:
> oldVector xyz;
> function( &xyz );
>
> myVector xyz;
> function( &xyz );
>
> My original implementation solved the issue using inheritance. That
> is, in pseudo code:
>
> // old code
> typedef struct {float x, y, z;} oldVector;
>
> /// my class
> class myVector : public oldVector
> {
> /// new methods here
> };
>
> This worked fine for my needs, but I wanted to change myVector class
> to be a template which would likely prevent the inheritance.
>
> I know the alignment in the compilers I will be should result in an
> identical memory layout.
> I was wondering if it was possible to use type casting to work around
> it.
>


This is possible, but lets try somthing different first.

> Basically, I was thinking something along the lines of:
>
> template <class T> class Vec3
> {
> public:
> T x, y, z;
> // other methods....
> };
>
> class myVector : public Vec3< float >
> {
> operator oldVector();
>
> // but for a pointer.... would this be valid????
> operator *oldVector();
> };
>


I'm guessing from what you say that you want to eventually make
myVector a class template as well, If so it would be usefull to
know what you intend to paramitise it on? I've guessed Flaot
bellow.

Anyway:

#include <iostream>
#include <ostream>
#include <vector>

#include <cstddef> /* for std::size_t */


/* Your old code:
*/
struct oldVector { float x, y, z; };

/* new template:
*/
template <typename Float>
class vec3
{
public:
// new stuff here

public: // private: /* maybe? */
Float x, y, z;
};

/* specialization for backward compatibility:
*/
template <>
class vec3< float >: public oldVector
{
public:
// all your new stuff again

/* uncomment _make_too_big_ to see check the compile time assert works:
*/
//char _make_too_big_;
};


template <std::size_t szA, std::size_t szB>
struct ASSERT_EQUAL_SIZE_helper;

template <std::size_t szT>
struct ASSERT_EQUAL_SIZE_helper< szT, szT>
{
static void is_equal_size() {}
};


template <typename A, typename B>
struct ASSERT_EQUAL_SIZE:
ASSERT_EQUAL_SIZE_helper< sizeof(A), sizeof(B) >
{
};


template <typename Float>
class myVector : public vec3< Float >
{
public:

myVector(Float xx, Float yy, Float zz)
{
x = xx;
y = yy;
z = zz;
}

~myVector(); // for assert
};

template <typename Float>
inline myVector< Float >::~myVector()
{
/* do nothing dtor (no assert needed) */
}

template <>
myVector< float >::~myVector()
{
/* check the size of *this is the same as oldVector
*/
ASSERT_EQUAL_SIZE< myVector< float >, oldVector >
::
is_equal_size()
;
}


void test(oldVector *xyz, std::size_t n)
{
for (std::size_t i = 0; i < n; ++i)
{
std::cout
<< xyz[i].x
<< ","
<< xyz[i].y
<< ","
<< xyz[i].z
<< std::endl
;
}
}

int main()
{
typedef float float_t;
std::vector< myVector< float_t > > a;
myVector< float_t> v(1, 2, 3);

a.push_back(v);
a.push_back(v);
a.push_back(v);

test(&a[0], a.size());
}


The obove compiled on g++ (gcc 3.2) and MSVC 7.1.

HTH

Rob.
--
http://www.victim-prime.dsl.pipex.com/
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
struct ptr within the same struct Ufit C++ 5 02-20-2006 11:01 AM
is (!ptr) or (ptr) valid way to check for NULL or NOT NULL? G Fernandes C Programming 9 02-27-2005 03:07 AM
const ptr to const ptr ? franco ziade C Programming 3 02-17-2005 04:30 AM
How to convert a double **ptr in a double const ** const ptr? Heiko Vogel C Programming 3 09-14-2004 10:23 AM
what's the difference between delete ptr and ptr=0 -dont they accomplish the same Sid C++ 5 07-29-2004 03:42 AM



Advertisments