Connecting Tech Pros Worldwide Help | Site Map

Mapping Function

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 22nd, 2005, 09:00 AM
naruto
Guest
 
Posts: n/a
Default Mapping Function

Hi all,

I have the following being defined in a A.cxx file.

// define in source file. Not exported to the outside world (this
cannot be
// moved to the header file [restriction])
#define CHANNEL_0 0
#define CHANNEL_1 1
#define CHANNEL_2 2
#define CHANNEL_3 3
#define CHANNEL_4 4
#define CHANNEL_5 5

However, in another file B.cxx, I have a fucntion called:

registerChannel(int channelNumber_)
{
// perform registration via channel number (valid range 0 - 5)
register(channelNumber_);
}

It works fine. However, now there is a new requirements: Channel
0,2,4 must maps to 0, 1, 2. Other channel maps to an invalid value.

I was wondering what is the best way to implements the mapping
function. My idea is as follows:

// 255 is an invalid value
#define INVALID_CHANNEL 255
int ChannelMapArray[] =
{0, INVALID_CHANNEL, 1, INVALID_CHANNEL, 2, INVALID_VALUE, };


So I could just use it in registerChannel() as follows:
registerChannel(int channelNumber_)
{
// perform registration via channel number (valid range 0 - 5)
register(ChannelMapArray[channelNumber_]);
}


Is there a better way to implement a mapping function. The array
implementation seems unclear. Also, is it possible to implement it as
a 2 ways mapping function (i.e given 1-6 -> 0,1,2,invalid or vice
versa)? Is there a commonly known technique for this? Is it possible
to reference the mapping to the #define in A.cxx?

Thanks All,
Naruto

  #2  
Old July 22nd, 2005, 09:01 AM
Denis Remezov
Guest
 
Posts: n/a
Default Re: Mapping Function

naruto wrote:[color=blue]
>
> Hi all,
>
> I have the following being defined in a A.cxx file.
>
> // define in source file. Not exported to the outside world (this
> cannot be
> // moved to the header file [restriction])[/color]

A header file does not necessarily mean the outside world. The
restriction is superficial.

[color=blue]
> #define CHANNEL_0 0
> #define CHANNEL_1 1
> #define CHANNEL_2 2
> #define CHANNEL_3 3
> #define CHANNEL_4 4
> #define CHANNEL_5 5
>[/color]

You might benefit from using enums. In addition, you have two
different systems of channel values, they could be represented by
two different enum types to eliminate the confusion as to which
channel system int channelNumber_ belongs.

[color=blue]
> However, in another file B.cxx, I have a fucntion called:
>
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(channelNumber_);
> }
>
> It works fine. However, now there is a new requirements: Channel
> 0,2,4 must maps to 0, 1, 2. Other channel maps to an invalid value.
>
> I was wondering what is the best way to implements the mapping
> function. My idea is as follows:
>
> // 255 is an invalid value
> #define INVALID_CHANNEL 255
> int ChannelMapArray[] =
> {0, INVALID_CHANNEL, 1, INVALID_CHANNEL, 2, INVALID_VALUE, };
>
> So I could just use it in registerChannel() as follows:
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(ChannelMapArray[channelNumber_]);
> }
>
> Is there a better way to implement a mapping function.[/color]

You've said it: implement a mapping function.

[color=blue]
> The array
> implementation seems unclear. Also, is it possible to implement it as
> a 2 ways mapping function (i.e given 1-6 -> 0,1,2,invalid or vice
> versa)? Is there a commonly known technique for this?[/color]


Something to the effect:

//I contrived the names; imagined that you have, e.g., "device" and
//"logical" channels

class ChannelMapping {
struct MappingInfo {
channel_type_log channel_log;
channel_type_dev channel_dev;
};

static MappingInfo mapping_info_[];

public:
static channel_type_log devToLog(channel_type_dev channel) {...}
static channel_type_dev logToSrc(channel_type_log channel) {...}
};

Depending on your design you may need not to make these functions static.
Otherwise you can use a namespace instead of a class. Define mapping_info_
(give it a better name). Use it directly or write an init() function to
create an optimised storage for search by the mapping functions for a
sufficiently large number of values.

[color=blue]
> Is it possible
> to reference the mapping to the #define in A.cxx?[/color]

Move them to file A_internal_whatever.h

Denis
[color=blue]
>
> Thanks All,
> Naruto[/color]
  #3  
Old July 22nd, 2005, 09:01 AM
Denis Remezov
Guest
 
Posts: n/a
Default Re: Mapping Function

naruto wrote:[color=blue]
>
> Hi all,
>
> I have the following being defined in a A.cxx file.
>
> // define in source file. Not exported to the outside world (this
> cannot be
> // moved to the header file [restriction])[/color]

A header file does not necessarily mean the outside world. The
restriction is superficial.

[color=blue]
> #define CHANNEL_0 0
> #define CHANNEL_1 1
> #define CHANNEL_2 2
> #define CHANNEL_3 3
> #define CHANNEL_4 4
> #define CHANNEL_5 5
>[/color]

You might benefit from using enums. In addition, you have two
different systems of channel values, they could be represented by
two different enum types to eliminate the confusion as to which
channel system int channelNumber_ belongs.

[color=blue]
> However, in another file B.cxx, I have a fucntion called:
>
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(channelNumber_);
> }
>
> It works fine. However, now there is a new requirements: Channel
> 0,2,4 must maps to 0, 1, 2. Other channel maps to an invalid value.
>
> I was wondering what is the best way to implements the mapping
> function. My idea is as follows:
>
> // 255 is an invalid value
> #define INVALID_CHANNEL 255
> int ChannelMapArray[] =
> {0, INVALID_CHANNEL, 1, INVALID_CHANNEL, 2, INVALID_VALUE, };
>
> So I could just use it in registerChannel() as follows:
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(ChannelMapArray[channelNumber_]);
> }
>
> Is there a better way to implement a mapping function.[/color]

You've said it: implement a mapping function.

[color=blue]
> The array
> implementation seems unclear. Also, is it possible to implement it as
> a 2 ways mapping function (i.e given 1-6 -> 0,1,2,invalid or vice
> versa)? Is there a commonly known technique for this?[/color]


Something to the effect:

//I contrived the names; imagined that you have, e.g., "device" and
//"logical" channels

class ChannelMapping {
struct MappingInfo {
channel_type_log channel_log;
channel_type_dev channel_dev;
};

static MappingInfo mapping_info_[];

public:
static channel_type_log devToLog(channel_type_dev channel) {...}
static channel_type_dev logToSrc(channel_type_log channel) {...}
};

Depending on your design you may need not to make these functions static.
Otherwise you can use a namespace instead of a class. Define mapping_info_
(give it a better name). Use it directly or write an init() function to
create an optimised storage for search by the mapping functions for a
sufficiently large number of values.

[color=blue]
> Is it possible
> to reference the mapping to the #define in A.cxx?[/color]

Move them to file A_internal_whatever.h

Denis
[color=blue]
>
> Thanks All,
> Naruto[/color]
  #4  
Old July 22nd, 2005, 09:01 AM
Thomas Matthews
Guest
 
Posts: n/a
Default Re: Mapping Function

naruto wrote:
[color=blue]
> Hi all,
>
> I have the following being defined in a A.cxx file.
>
> // define in source file. Not exported to the outside world (this
> cannot be
> // moved to the header file [restriction])
> #define CHANNEL_0 0
> #define CHANNEL_1 1
> #define CHANNEL_2 2
> #define CHANNEL_3 3
> #define CHANNEL_4 4
> #define CHANNEL_5 5
>
> However, in another file B.cxx, I have a fucntion called:
>
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(channelNumber_);
> }
>
> It works fine. However, now there is a new requirements: Channel
> 0,2,4 must maps to 0, 1, 2. Other channel maps to an invalid value.
>
> I was wondering what is the best way to implements the mapping
> function. My idea is as follows:
>
> // 255 is an invalid value
> #define INVALID_CHANNEL 255
> int ChannelMapArray[] =
> {0, INVALID_CHANNEL, 1, INVALID_CHANNEL, 2, INVALID_VALUE, };
>
>
> So I could just use it in registerChannel() as follows:
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(ChannelMapArray[channelNumber_]);
> }
>
>
> Is there a better way to implement a mapping function. The array
> implementation seems unclear. Also, is it possible to implement it as
> a 2 ways mapping function (i.e given 1-6 -> 0,1,2,invalid or vice
> versa)? Is there a commonly known technique for this? Is it possible
> to reference the mapping to the #define in A.cxx?
>
> Thanks All,
> Naruto[/color]

One could always use the std::map container:
#include <map>
using std::map;
typedef map<unsigned int, unsigned int> Mapping_Container;

The mapping would be:
Mapping_Container channel_map;
//...
unsigned int original_value;
unsigned int new_value;

//...
new_value = channel_map[original_value];


--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

  #5  
Old July 22nd, 2005, 09:01 AM
Thomas Matthews
Guest
 
Posts: n/a
Default Re: Mapping Function

naruto wrote:
[color=blue]
> Hi all,
>
> I have the following being defined in a A.cxx file.
>
> // define in source file. Not exported to the outside world (this
> cannot be
> // moved to the header file [restriction])
> #define CHANNEL_0 0
> #define CHANNEL_1 1
> #define CHANNEL_2 2
> #define CHANNEL_3 3
> #define CHANNEL_4 4
> #define CHANNEL_5 5
>
> However, in another file B.cxx, I have a fucntion called:
>
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(channelNumber_);
> }
>
> It works fine. However, now there is a new requirements: Channel
> 0,2,4 must maps to 0, 1, 2. Other channel maps to an invalid value.
>
> I was wondering what is the best way to implements the mapping
> function. My idea is as follows:
>
> // 255 is an invalid value
> #define INVALID_CHANNEL 255
> int ChannelMapArray[] =
> {0, INVALID_CHANNEL, 1, INVALID_CHANNEL, 2, INVALID_VALUE, };
>
>
> So I could just use it in registerChannel() as follows:
> registerChannel(int channelNumber_)
> {
> // perform registration via channel number (valid range 0 - 5)
> register(ChannelMapArray[channelNumber_]);
> }
>
>
> Is there a better way to implement a mapping function. The array
> implementation seems unclear. Also, is it possible to implement it as
> a 2 ways mapping function (i.e given 1-6 -> 0,1,2,invalid or vice
> versa)? Is there a commonly known technique for this? Is it possible
> to reference the mapping to the #define in A.cxx?
>
> Thanks All,
> Naruto[/color]

One could always use the std::map container:
#include <map>
using std::map;
typedef map<unsigned int, unsigned int> Mapping_Container;

The mapping would be:
Mapping_Container channel_map;
//...
unsigned int original_value;
unsigned int new_value;

//...
new_value = channel_map[original_value];


--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

  #6  
Old July 22nd, 2005, 09:02 AM
naruto
Guest
 
Posts: n/a
Default Re: Mapping Function

> //I contrived the names; imagined that you have, e.g., "device" and[color=blue]
> //"logical" channels
>
> class ChannelMapping {
> struct MappingInfo {
> channel_type_log channel_log;
> channel_type_dev channel_dev;
> };
>
> static MappingInfo mapping_info_[];
>
> public:
> static channel_type_log devToLog(channel_type_dev channel) {...}
> static channel_type_dev logToSrc(channel_type_log channel) {...}
> };
>
> Depending on your design you may need not to make these functions static.
> Otherwise you can use a namespace instead of a class. Define mapping_info_
> (give it a better name). Use it directly or write an init() function to
> create an optimised storage for search by the mapping functions for a
> sufficiently large number of values.
>
>[color=green]
> > Is it possible
> > to reference the mapping to the #define in A.cxx?[/color]
>
> Move them to file A_internal_whatever.h
>
> Denis[/color]

Thanks Denis. I didn't thought of using a class or namespace to
perform a mapping fuction. Thanks!!

Naruto
  #7  
Old July 22nd, 2005, 09:02 AM
naruto
Guest
 
Posts: n/a
Default Re: Mapping Function

> //I contrived the names; imagined that you have, e.g., "device" and[color=blue]
> //"logical" channels
>
> class ChannelMapping {
> struct MappingInfo {
> channel_type_log channel_log;
> channel_type_dev channel_dev;
> };
>
> static MappingInfo mapping_info_[];
>
> public:
> static channel_type_log devToLog(channel_type_dev channel) {...}
> static channel_type_dev logToSrc(channel_type_log channel) {...}
> };
>
> Depending on your design you may need not to make these functions static.
> Otherwise you can use a namespace instead of a class. Define mapping_info_
> (give it a better name). Use it directly or write an init() function to
> create an optimised storage for search by the mapping functions for a
> sufficiently large number of values.
>
>[color=green]
> > Is it possible
> > to reference the mapping to the #define in A.cxx?[/color]
>
> Move them to file A_internal_whatever.h
>
> Denis[/color]

Thanks Denis. I didn't thought of using a class or namespace to
perform a mapping fuction. Thanks!!

Naruto
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

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 Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,840 network members.