[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