[Click] Use STL for new element

Eddie Kohler kohler at CS.UCLA.EDU
Sun Mar 13 09:49:45 EST 2005


Alan,

You cannot use the STL in the kernel.

It works fine at user level.

But you need to use Click's libraries *exclusively* if you want to run properly 
in linuxmodule mode.  (Someone better with C++ than I might be able to make STL 
work, but I doubt it.)

While Click's Vector<> has an essentially STL-compatible interface, HashMap does 
not.

map::operator[](x)   ==>  HashMap::find(x)
map::find(x) == map::end()  ==>  HashMap::findp(x) != 0

For more information, please ask specific questions, read the code, or look for 
uses of HashMap within Click.

Eddie


Alan Tang wrote:
> Dear everyone
> 
> Since I can not find documentation about how to use hashmap in click. I 
> used map from stl.
> 
> Strangely map from stl is okay. But when I try to compile the new 
> element, error from my system library came out, which I don't 
> understand. Here is  the header file of the new element.  I also added 
> the small program that proves my map from system library is okay.
> 
> #ifndef CLICK_SMARTQUEUE_HH
> #define CLICK_SMARTQUEUE_HH
> #include "../standard/notifierqueue.hh"
> #include <map>
> using namespace std;
> 
> CLICK_DECLS
> /*
> 
> */
> 
> class SmartQueue : public NotifierQueue
> {
> public:
>  SmartQueue();
>  ~SmartQueue();
> 
>  const char *class_name() const          {return "SmartQueue";}
>  void *cast(const char *);
> 
>  void push(int port,Packet *);
> 
>  void statistics();
> 
> private:
> 
>  map<unsigned,unsigned> _statistics;
> 
> };
> 
> CLICK_ENDDECLS
> #endif
> 
> 
> ----------------------------------------------------------
> 
> 
> error msg (first 20%):
> g++ -w -W -Wall -fno-exceptions -fno-rtti  -fpermissive -DHAVE_CONFIG_H  
> -I../include -I../include -I. -I.. -I/usr/src/linux/include 
> -INONE/click_wifi -DCLICK_LINUXMODULE -O2 -MD -c 
> ../elements/local/smartqueue.cc
> In file included from /usr/include/c++/3.3/cstring:51,
>                 from /usr/include/c++/3.3/bits/stl_algobase.h:65,
>                 from /usr/include/c++/3.3/bits/stl_tree.h:86,
>                 from /usr/include/c++/3.3/map:66,
>                 from ../elements/local/smartqueue.hh:4,
>                 from ../elements/local/smartqueue.cc:2:
> /usr/include/string.h:38: error: parse error before `?' token
> /usr/include/string.h:58: error: parse error before `?' token
> In file included from /usr/include/c++/3.3/bits/stl_algobase.h:65,
>                 from /usr/include/c++/3.3/bits/stl_tree.h:86,
>                 from /usr/include/c++/3.3/map:66,
>                 from ../elements/local/smartqueue.hh:4,
>                 from ../elements/local/smartqueue.cc:2:
> /usr/include/c++/3.3/cstring:79: error: `memcpy' not declared
> /usr/include/c++/3.3/cstring:85: error: `memcmp' not declared
> /usr/include/c++/3.3/cstring:93: error: `memset' not declared
> In file included from /usr/include/limits.h:152,
>                 from 
> /usr/lib/gcc-lib/i486-linux/3.3.5/include/limits.h:122,
>                 from 
> /usr/lib/gcc-lib/i486-linux/3.3.5/include/syslimits.h:7,
>                 from /usr/lib/gcc-lib/i486-linux/3.3.5/include/limits.h:11,
>                 from /usr/include/c++/3.3/climits:49,
>                 from /usr/include/c++/3.3/bits/stl_algobase.h:66,
>                 from /usr/include/c++/3.3/bits/stl_tree.h:86,
>                 from /usr/include/c++/3.3/map:66,
>                 from ../elements/local/smartqueue.hh:4,
>                 from ../elements/local/smartqueue.cc:2:
> /usr/include/bits/xopen_lim.h:95:6: missing binary operator before token 
> "("
> /usr/include/bits/xopen_lim.h:98:7: missing binary operator before token 
> "("
> /usr/include/bits/xopen_lim.h:122:6: missing binary operator before 
> token "("
> In file included from /usr/include/c++/3.3/cstdlib:52,
>                 from /usr/include/c++/3.3/bits/stl_algobase.h:67,
>                 from /usr/include/c++/3.3/bits/stl_tree.h:86,
>                 from /usr/include/c++/3.3/map:66,
>                 from ../elements/local/smartqueue.hh:4,
>                 from ../elements/local/smartqueue.cc:2:
> /usr/include/stdlib.h: In function `long unsigned int strtoul(const char*,
>   char**, int)':
> /usr/include/stdlib.h:322: error: redefinition of `long unsigned int
>   strtoul(const char*, char**, int)'
> ../include/click/glue.hh:139: error: `long unsigned int strtoul(const 
> char*,
>   char**, int)' previously defined here
> In file included from /usr/include/stdlib.h:416,
>                 from /usr/include/c++/3.3/cstdlib:52,
>                 from /usr/include/c++/3.3/bits/stl_algobase.h:67,
>                 from /usr/include/c++/3.3/bits/stl_tree.h:86,
>                 from /usr/include/c++/3.3/map:66,
>                 from ../elements/local/smartqueue.hh:4,
>                 from ../elements/local/smartqueue.cc:2:
> /usr/include/sys/types.h: At global scope:
> /usr/include/sys/types.h:41: error: conflicting types for `typedef struct
>   __fsid_t fsid_t'
> /usr/src/linux/include/asm/statfs.h:8: error: previous declaration as 
> `typedef
>   struct __kernel_fsid_t fsid_t'
> /usr/include/sys/types.h:62: error: conflicting types for `typedef __dev_t
>   dev_t'
> /usr/src/linux/include/linux/types.h:21: error: previous declaration as `
>   typedef __kernel_dev_t dev_t'
> /usr/include/sys/types.h:72: error: conflicting types for `typedef __mode_t
>   mode_t'
> /usr/src/linux/include/linux/types.h:23: error: previous declaration as `
>   typedef __kernel_mode_t mode_t'
> /usr/include/sys/types.h:77: error: conflicting types for `typedef 
> __nlink_t
>   nlink_t'
> /usr/src/linux/include/linux/types.h:24: error: previous declaration as `
>   typedef __kernel_nlink_t nlink_t'
> 
> .
> .
> .
> ---------------------------------------------
> 
> small example that works:
> 
> #include <map>
> #include <string>
> #include <iostream>
> using namespace std;
> 
> int main( )
> {
>    map<string,double> salaries;
> 
>    salaries["Pat"] = 75000.00;
>    cout << salaries["Pat"] << endl;
>    cout << salaries["Jan"] << endl;
> 
>    map<string,double>::const_iterator itr;
>    itr = salaries.find("Chris");
>    if( itr == salaries.end( ) )
>        cout << "Not an employee of this company!" << endl;
>    else
>        cout << itr->second << endl;
> 
>    return 0;
> --------------------------------------------
> 
> output:
> 75000
> 0
> Not an employee of this company!
> 
> Kind regards
> Alan
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click


More information about the click mailing list