From cddcd72e336afd2330d706ecaad004956e5dc6b8 Mon Sep 17 00:00:00 2001 From: Mirko Lindner Date: Thu, 4 Feb 2010 12:33:47 +0100 Subject: [PATCH] initial commit - needs clean-up Signed-off-by: Mirko Lindner --- AUTHORS | 3 + COPYING | 340 + ChangeLog | 154 + INSTALL | 8 + Makefile.am | 1 + NEWS | 0 README | 0 README.txt | 26 + acinclude.m4 | 168 + aclocal.m4 | 952 ++ autorun.gpu | 3 + configure.in | 30 + pandora/gmenu2x.conf | 18 + pandora/input.conf.gp2x | 14 + pandora/input.conf.xbox360 | 23 + pandora/scripts/services.sh | 12 + pandora/scripts/usboff.sh | 11 + pandora/scripts/usbon.sh | 15 + pandora/sections/applications/ebook | 6 + pandora/sections/applications/mplayer | 5 + pandora/sections/applications/music | 5 + pandora/sections/applications/photo | 6 + pandora/sections/emulators/Amiga | 5 + pandora/sections/emulators/GBAdvance | 9 + pandora/sections/emulators/GameBoy | 6 + pandora/sections/emulators/Genesis | 9 + pandora/sections/emulators/Mame | 10 + pandora/sections/emulators/NK SNES | 5 + pandora/sections/emulators/NeoGeo | 5 + pandora/sections/emulators/NeoGeo Pocket | 9 + pandora/sections/emulators/Nintendo | 9 + pandora/sections/emulators/PcEngine | 5 + pandora/sections/emulators/PlayStation | 5 + pandora/sections/emulators/SSnes | 9 + pandora/sections/emulators/fishyNES | 4 + pandora/sections/emulators/hu6280 | 5 + pandora/sections/games/Barrage | 3 + pandora/sections/games/CDogs | 4 + pandora/sections/games/ClonkFront | 4 + pandora/sections/games/Nethack | 3 + pandora/sections/games/PaybackDemo | 5 + pandora/sections/games/S-Tris 2 | 2 + pandora/sections/games/beat2x | 4 + pandora/sections/games/blazar | 4 + pandora/sections/games/duke3d | 4 + pandora/sections/games/hexahop | 3 + pandora/sections/games/ladykiller | 3 + pandora/sections/games/myriad | 3 + pandora/sections/games/openglad | 5 + pandora/sections/games/openjazz | 3 + pandora/sections/games/puzzleland | 5 + pandora/sections/games/rubido | 5 + pandora/sections/games/scummvm | 5 + pandora/sections/games/smashgp | 3 + pandora/sections/games/smw | 6 + pandora/sections/games/sokoban | 5 + pandora/sections/games/supertux | 4 + pandora/sections/games/vektar | 5 + pandora/sections/settings/exit | 6 + pandora/sections/settings/originalsettings | 6 + pandora/sections/settings/system | 6 + pandora/skins/Default/icons/about.png | Bin 0 -> 2671 bytes pandora/skins/Default/icons/configure.png | Bin 0 -> 2857 bytes pandora/skins/Default/icons/ebook.png | Bin 0 -> 2805 bytes pandora/skins/Default/icons/exit.png | Bin 0 -> 2446 bytes pandora/skins/Default/icons/explorer.png | Bin 0 -> 1646 bytes pandora/skins/Default/icons/generic.png | Bin 0 -> 2853 bytes pandora/skins/Default/icons/mplayer.png | Bin 0 -> 2291 bytes pandora/skins/Default/icons/music.png | Bin 0 -> 3095 bytes pandora/skins/Default/icons/photo.png | Bin 0 -> 2605 bytes pandora/skins/Default/icons/section.png | Bin 0 -> 2972 bytes pandora/skins/Default/icons/skin.png | Bin 0 -> 2742 bytes pandora/skins/Default/icons/tv.png | Bin 0 -> 1509 bytes pandora/skins/Default/icons/usb.png | Bin 0 -> 1910 bytes pandora/skins/Default/icons/wallpaper.png | Bin 0 -> 1837 bytes pandora/skins/Default/imgs/battery/0.png | Bin 0 -> 545 bytes pandora/skins/Default/imgs/battery/1.png | Bin 0 -> 554 bytes pandora/skins/Default/imgs/battery/2.png | Bin 0 -> 605 bytes pandora/skins/Default/imgs/battery/3.png | Bin 0 -> 612 bytes pandora/skins/Default/imgs/battery/4.png | Bin 0 -> 582 bytes pandora/skins/Default/imgs/battery/5.png | Bin 0 -> 542 bytes pandora/skins/Default/imgs/battery/ac.png | Bin 0 -> 921 bytes pandora/skins/Default/imgs/bottombar.png | Bin 0 -> 8453 bytes pandora/skins/Default/imgs/buttons/a.png | Bin 0 -> 3269 bytes pandora/skins/Default/imgs/buttons/b.png | Bin 0 -> 3242 bytes pandora/skins/Default/imgs/buttons/down.png | Bin 0 -> 3212 bytes pandora/skins/Default/imgs/buttons/l.png | Bin 0 -> 3056 bytes pandora/skins/Default/imgs/buttons/left.png | Bin 0 -> 3200 bytes pandora/skins/Default/imgs/buttons/r.png | Bin 0 -> 3137 bytes pandora/skins/Default/imgs/buttons/right.png | Bin 0 -> 3209 bytes .../skins/Default/imgs/buttons/sectionl.png | Bin 0 -> 3056 bytes .../skins/Default/imgs/buttons/sectionr.png | Bin 0 -> 3137 bytes pandora/skins/Default/imgs/buttons/select.png | Bin 0 -> 3126 bytes pandora/skins/Default/imgs/buttons/start.png | Bin 0 -> 3155 bytes pandora/skins/Default/imgs/buttons/stick.png | Bin 0 -> 3047 bytes pandora/skins/Default/imgs/buttons/up.png | Bin 0 -> 3206 bytes pandora/skins/Default/imgs/buttons/vol+.png | Bin 0 -> 3125 bytes pandora/skins/Default/imgs/buttons/vol-.png | Bin 0 -> 3058 bytes pandora/skins/Default/imgs/buttons/x.png | Bin 0 -> 3241 bytes pandora/skins/Default/imgs/buttons/y.png | Bin 0 -> 3308 bytes pandora/skins/Default/imgs/cpu.png | Bin 0 -> 724 bytes pandora/skins/Default/imgs/file.png | Bin 0 -> 415 bytes pandora/skins/Default/imgs/folder.png | Bin 0 -> 530 bytes pandora/skins/Default/imgs/font.png | Bin 0 -> 7532 bytes pandora/skins/Default/imgs/go-up.png | Bin 0 -> 781 bytes pandora/skins/Default/imgs/inet.png | Bin 0 -> 914 bytes pandora/skins/Default/imgs/l_disabled.png | Bin 0 -> 278 bytes pandora/skins/Default/imgs/l_enabled.png | Bin 0 -> 281 bytes pandora/skins/Default/imgs/manual.png | Bin 0 -> 978 bytes pandora/skins/Default/imgs/menu.png | Bin 0 -> 855 bytes pandora/skins/Default/imgs/mute.png | Bin 0 -> 767 bytes pandora/skins/Default/imgs/phones.png | Bin 0 -> 488 bytes pandora/skins/Default/imgs/r_disabled.png | Bin 0 -> 398 bytes pandora/skins/Default/imgs/r_enabled.png | Bin 0 -> 462 bytes pandora/skins/Default/imgs/samba.png | Bin 0 -> 989 bytes pandora/skins/Default/imgs/sd.png | Bin 0 -> 772 bytes pandora/skins/Default/imgs/selection.png | Bin 0 -> 3036 bytes pandora/skins/Default/imgs/topbar.png | Bin 0 -> 10345 bytes pandora/skins/Default/imgs/volume.png | Bin 0 -> 963 bytes pandora/skins/Default/imgs/webserver.png | Bin 0 -> 1163 bytes .../skins/Default/sections/applications.png | Bin 0 -> 2080 bytes pandora/skins/Default/sections/emulators.png | Bin 0 -> 1952 bytes pandora/skins/Default/sections/games.png | Bin 0 -> 2590 bytes pandora/skins/Default/sections/settings.png | Bin 0 -> 3316 bytes pandora/skins/Default/skin.conf | 9 + .../Default/wallpapers/pandora-nova-desat.png | Bin 0 -> 153566 bytes pandora/translations/Basque | 129 + pandora/translations/Catalan | 137 + pandora/translations/Danish | 129 + pandora/translations/Dutch | 118 + pandora/translations/Finnish | 117 + pandora/translations/French | 129 + pandora/translations/German | 129 + pandora/translations/Italian | 142 + pandora/translations/Norwegian | 118 + pandora/translations/Portuguese (Portugal) | 118 + pandora/translations/Russian | 132 + pandora/translations/Slovak | 137 + pandora/translations/Spanish | 129 + pandora/translations/Swedish | 119 + pandora/translations/Turkish | 133 + src/FastDelegate.h | 2108 ++++ src/Makefile.am | 15 + src/asfont.cpp | 124 + src/asfont.h | 49 + src/button.cpp | 71 + src/button.h | 62 + src/cpu.cpp | 98 + src/cpu.h | 24 + src/dirdialog.cpp | 202 + src/dirdialog.h | 64 + src/filedialog.cpp | 187 + src/filedialog.h | 65 + src/filelister.cpp | 136 + src/filelister.h | 54 + src/font-14.xcf | Bin 0 -> 34678 bytes src/font.xcf | Bin 0 -> 25730 bytes src/gmenu2x.cpp | 1979 ++++ src/gmenu2x.h | 242 + src/gp2x.h | 53 + src/iconbutton.cpp | 121 + src/iconbutton.h | 43 + src/imagedialog.cpp | 64 + src/imagedialog.h | 40 + src/inputdialog.cpp | 302 + src/inputdialog.h | 76 + src/inputmanager.cpp | 198 + src/inputmanager.h | 89 + src/jz4740.h | 5212 ++++++++++ src/link.cpp | 124 + src/link.h | 70 + src/linkaction.cpp | 34 + src/linkaction.h | 50 + src/linkapp.cpp | 574 ++ src/linkapp.h | 109 + src/listview.cpp | 78 + src/listview.h | 59 + src/listviewitem.cpp | 30 + src/listviewitem.h | 48 + src/lr.xcf | Bin 0 -> 21447 bytes src/menu.cpp | 457 + src/menu.h | 85 + src/menusetting.cpp | 36 + src/menusetting.h | 54 + src/menusettingbool.cpp | 95 + src/menusettingbool.h | 57 + src/menusettingdir.cpp | 81 + src/menusettingdir.h | 53 + src/menusettingfile.cpp | 82 + src/menusettingfile.h | 54 + src/menusettingimage.cpp | 56 + src/menusettingimage.h | 37 + src/menusettingint.cpp | 106 + src/menusettingint.h | 57 + src/menusettingmultistring.cpp | 80 + src/menusettingmultistring.h | 53 + src/menusettingrgba.cpp | 168 + src/menusettingrgba.h | 64 + src/menusettingstring.cpp | 82 + src/menusettingstring.h | 53 + src/messagebox.cpp | 120 + src/messagebox.h | 48 + src/pxml.cpp | 127 + src/pxml.h | 59 + src/selector.cpp | 244 + src/selector.h | 55 + src/selectordetector.cpp | 47 + src/selectordetector.h | 58 + src/settingsdialog.cpp | 140 + src/settingsdialog.h | 51 + src/sfontplus.cpp | 196 + src/sfontplus.h | 43 + src/sparsehash-1.6/AUTHORS | 2 + src/sparsehash-1.6/COPYING | 28 + src/sparsehash-1.6/ChangeLog | 182 + src/sparsehash-1.6/INSTALL | 236 + src/sparsehash-1.6/Makefile.am | 157 + src/sparsehash-1.6/NEWS | 0 src/sparsehash-1.6/README | 149 + src/sparsehash-1.6/TODO | 28 + src/sparsehash-1.6/aclocal.m4 | 868 ++ src/sparsehash-1.6/configure.ac | 74 + src/sparsehash-1.6/doc/dense_hash_map.html | 1591 +++ src/sparsehash-1.6/doc/dense_hash_set.html | 1445 +++ src/sparsehash-1.6/doc/designstyle.css | 115 + src/sparsehash-1.6/doc/implementation.html | 371 + src/sparsehash-1.6/doc/index.html | 69 + src/sparsehash-1.6/doc/performance.html | 96 + src/sparsehash-1.6/doc/sparse_hash_map.html | 1527 +++ src/sparsehash-1.6/doc/sparse_hash_set.html | 1376 +++ src/sparsehash-1.6/doc/sparsetable.html | 1393 +++ src/sparsehash-1.6/experimental/Makefile | 9 + src/sparsehash-1.6/experimental/README | 14 + src/sparsehash-1.6/experimental/example.c | 54 + src/sparsehash-1.6/experimental/libchash.c | 1537 +++ src/sparsehash-1.6/experimental/libchash.h | 252 + src/sparsehash-1.6/google-sparsehash.sln | 47 + src/sparsehash-1.6/hashtable_unittest | Bin 0 -> 4575403 bytes src/sparsehash-1.6/m4/acx_pthread.m4 | 363 + src/sparsehash-1.6/m4/google_namespace.m4 | 42 + src/sparsehash-1.6/m4/namespaces.m4 | 15 + src/sparsehash-1.6/m4/stl_hash.m4 | 70 + src/sparsehash-1.6/m4/stl_hash_fun.m4 | 36 + src/sparsehash-1.6/m4/stl_namespace.m4 | 25 + src/sparsehash-1.6/missing | 360 + src/sparsehash-1.6/mkinstalldirs | 158 + src/sparsehash-1.6/packages/deb.sh | 74 + src/sparsehash-1.6/packages/deb/README | 7 + src/sparsehash-1.6/packages/deb/changelog | 113 + src/sparsehash-1.6/packages/deb/compat | 1 + src/sparsehash-1.6/packages/deb/control | 17 + src/sparsehash-1.6/packages/deb/copyright | 35 + src/sparsehash-1.6/packages/deb/docs | 16 + src/sparsehash-1.6/packages/deb/rules | 117 + .../packages/deb/sparsehash.dirs | 2 + .../packages/deb/sparsehash.install | 2 + src/sparsehash-1.6/packages/rpm.sh | 86 + src/sparsehash-1.6/packages/rpm/rpm.spec | 61 + src/sparsehash-1.6/simple_test | Bin 0 -> 546143 bytes src/sparsehash-1.6/sparsetable_unittest | Bin 0 -> 371808 bytes src/sparsehash-1.6/src/config.h | 132 + src/sparsehash-1.6/src/config.h.in | 131 + src/sparsehash-1.6/src/config.h.include | 23 + src/sparsehash-1.6/src/google/dense_hash_map | 319 + src/sparsehash-1.6/src/google/dense_hash_set | 296 + src/sparsehash-1.6/src/google/sparse_hash_map | 301 + src/sparsehash-1.6/src/google/sparse_hash_set | 282 + .../src/google/sparsehash/densehashtable.h | 1158 +++ .../src/google/sparsehash/sparseconfig.h | 49 + .../src/google/sparsehash/sparsehashtable.h | 1081 ++ src/sparsehash-1.6/src/google/sparsetable | 1473 +++ src/sparsehash-1.6/src/google/type_traits.h | 250 + src/sparsehash-1.6/src/hashtable_unittest.cc | 1531 +++ src/sparsehash-1.6/src/simple_test.cc | 103 + .../src/sparsetable_unittest.cc | 696 ++ src/sparsehash-1.6/src/stamp-h1 | 1 + src/sparsehash-1.6/src/time_hash_map.cc | 488 + .../src/type_traits_unittest.cc | 492 + src/sparsehash-1.6/src/windows/config.h | 149 + .../windows/google/sparsehash/sparseconfig.h | 32 + src/sparsehash-1.6/src/windows/port.cc | 63 + src/sparsehash-1.6/src/windows/port.h | 81 + src/sparsehash-1.6/src/words | 8944 +++++++++++++++++ src/sparsehash-1.6/time_hash_map | Bin 0 -> 485077 bytes src/sparsehash-1.6/type_traits_unittest | Bin 0 -> 28684 bytes .../hashtable_unittest.vcproj | 185 + .../sparsetable_unittest.vcproj | 170 + .../time_hash_map/time_hash_map.vcproj | 185 + .../type_traits_unittest.vcproj | 167 + src/surface.cpp | 360 + src/surface.h | 107 + src/surfacecollection.cpp | 137 + src/surfacecollection.h | 63 + src/textdialog.cpp | 136 + src/textdialog.h | 44 + src/textmanualdialog.cpp | 122 + src/textmanualdialog.h | 45 + src/tinyxml/tinystr.cpp | 116 + src/tinyxml/tinystr.h | 319 + src/tinyxml/tinyxml.cpp | 1888 ++++ src/tinyxml/tinyxml.h | 1802 ++++ src/tinyxml/tinyxmlerror.cpp | 53 + src/tinyxml/tinyxmlparser.cpp | 1638 +++ src/touchscreen.cpp | 137 + src/touchscreen.h | 70 + src/translator.cpp | 96 + src/translator.h | 46 + src/utilities.cpp | 194 + src/utilities.h | 82 + src/wallpaperdialog.cpp | 137 + src/wallpaperdialog.h | 42 + 311 files changed, 59414 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 README.txt create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 autorun.gpu create mode 100644 configure.in create mode 100644 pandora/gmenu2x.conf create mode 100644 pandora/input.conf.gp2x create mode 100644 pandora/input.conf.xbox360 create mode 100755 pandora/scripts/services.sh create mode 100755 pandora/scripts/usboff.sh create mode 100755 pandora/scripts/usbon.sh create mode 100644 pandora/sections/applications/ebook create mode 100644 pandora/sections/applications/mplayer create mode 100644 pandora/sections/applications/music create mode 100644 pandora/sections/applications/photo create mode 100755 pandora/sections/emulators/Amiga create mode 100755 pandora/sections/emulators/GBAdvance create mode 100755 pandora/sections/emulators/GameBoy create mode 100755 pandora/sections/emulators/Genesis create mode 100755 pandora/sections/emulators/Mame create mode 100755 pandora/sections/emulators/NK SNES create mode 100755 pandora/sections/emulators/NeoGeo create mode 100755 pandora/sections/emulators/NeoGeo Pocket create mode 100755 pandora/sections/emulators/Nintendo create mode 100755 pandora/sections/emulators/PcEngine create mode 100755 pandora/sections/emulators/PlayStation create mode 100755 pandora/sections/emulators/SSnes create mode 100755 pandora/sections/emulators/fishyNES create mode 100755 pandora/sections/emulators/hu6280 create mode 100755 pandora/sections/games/Barrage create mode 100755 pandora/sections/games/CDogs create mode 100755 pandora/sections/games/ClonkFront create mode 100755 pandora/sections/games/Nethack create mode 100755 pandora/sections/games/PaybackDemo create mode 100755 pandora/sections/games/S-Tris 2 create mode 100755 pandora/sections/games/beat2x create mode 100755 pandora/sections/games/blazar create mode 100755 pandora/sections/games/duke3d create mode 100755 pandora/sections/games/hexahop create mode 100755 pandora/sections/games/ladykiller create mode 100755 pandora/sections/games/myriad create mode 100755 pandora/sections/games/openglad create mode 100755 pandora/sections/games/openjazz create mode 100755 pandora/sections/games/puzzleland create mode 100755 pandora/sections/games/rubido create mode 100755 pandora/sections/games/scummvm create mode 100755 pandora/sections/games/smashgp create mode 100755 pandora/sections/games/smw create mode 100755 pandora/sections/games/sokoban create mode 100755 pandora/sections/games/supertux create mode 100755 pandora/sections/games/vektar create mode 100755 pandora/sections/settings/exit create mode 100644 pandora/sections/settings/originalsettings create mode 100644 pandora/sections/settings/system create mode 100755 pandora/skins/Default/icons/about.png create mode 100644 pandora/skins/Default/icons/configure.png create mode 100755 pandora/skins/Default/icons/ebook.png create mode 100755 pandora/skins/Default/icons/exit.png create mode 100755 pandora/skins/Default/icons/explorer.png create mode 100755 pandora/skins/Default/icons/generic.png create mode 100755 pandora/skins/Default/icons/mplayer.png create mode 100755 pandora/skins/Default/icons/music.png create mode 100755 pandora/skins/Default/icons/photo.png create mode 100755 pandora/skins/Default/icons/section.png create mode 100644 pandora/skins/Default/icons/skin.png create mode 100755 pandora/skins/Default/icons/tv.png create mode 100755 pandora/skins/Default/icons/usb.png create mode 100755 pandora/skins/Default/icons/wallpaper.png create mode 100755 pandora/skins/Default/imgs/battery/0.png create mode 100755 pandora/skins/Default/imgs/battery/1.png create mode 100755 pandora/skins/Default/imgs/battery/2.png create mode 100755 pandora/skins/Default/imgs/battery/3.png create mode 100755 pandora/skins/Default/imgs/battery/4.png create mode 100755 pandora/skins/Default/imgs/battery/5.png create mode 100755 pandora/skins/Default/imgs/battery/ac.png create mode 100644 pandora/skins/Default/imgs/bottombar.png create mode 100755 pandora/skins/Default/imgs/buttons/a.png create mode 100755 pandora/skins/Default/imgs/buttons/b.png create mode 100755 pandora/skins/Default/imgs/buttons/down.png create mode 100755 pandora/skins/Default/imgs/buttons/l.png create mode 100755 pandora/skins/Default/imgs/buttons/left.png create mode 100755 pandora/skins/Default/imgs/buttons/r.png create mode 100755 pandora/skins/Default/imgs/buttons/right.png create mode 100755 pandora/skins/Default/imgs/buttons/sectionl.png create mode 100755 pandora/skins/Default/imgs/buttons/sectionr.png create mode 100755 pandora/skins/Default/imgs/buttons/select.png create mode 100755 pandora/skins/Default/imgs/buttons/start.png create mode 100755 pandora/skins/Default/imgs/buttons/stick.png create mode 100755 pandora/skins/Default/imgs/buttons/up.png create mode 100755 pandora/skins/Default/imgs/buttons/vol+.png create mode 100755 pandora/skins/Default/imgs/buttons/vol-.png create mode 100755 pandora/skins/Default/imgs/buttons/x.png create mode 100755 pandora/skins/Default/imgs/buttons/y.png create mode 100755 pandora/skins/Default/imgs/cpu.png create mode 100755 pandora/skins/Default/imgs/file.png create mode 100755 pandora/skins/Default/imgs/folder.png create mode 100755 pandora/skins/Default/imgs/font.png create mode 100644 pandora/skins/Default/imgs/go-up.png create mode 100755 pandora/skins/Default/imgs/inet.png create mode 100644 pandora/skins/Default/imgs/l_disabled.png create mode 100644 pandora/skins/Default/imgs/l_enabled.png create mode 100755 pandora/skins/Default/imgs/manual.png create mode 100644 pandora/skins/Default/imgs/menu.png create mode 100644 pandora/skins/Default/imgs/mute.png create mode 100644 pandora/skins/Default/imgs/phones.png create mode 100644 pandora/skins/Default/imgs/r_disabled.png create mode 100644 pandora/skins/Default/imgs/r_enabled.png create mode 100755 pandora/skins/Default/imgs/samba.png create mode 100755 pandora/skins/Default/imgs/sd.png create mode 100644 pandora/skins/Default/imgs/selection.png create mode 100644 pandora/skins/Default/imgs/topbar.png create mode 100755 pandora/skins/Default/imgs/volume.png create mode 100755 pandora/skins/Default/imgs/webserver.png create mode 100755 pandora/skins/Default/sections/applications.png create mode 100755 pandora/skins/Default/sections/emulators.png create mode 100755 pandora/skins/Default/sections/games.png create mode 100755 pandora/skins/Default/sections/settings.png create mode 100644 pandora/skins/Default/skin.conf create mode 100644 pandora/skins/Default/wallpapers/pandora-nova-desat.png create mode 100644 pandora/translations/Basque create mode 100644 pandora/translations/Catalan create mode 100644 pandora/translations/Danish create mode 100644 pandora/translations/Dutch create mode 100644 pandora/translations/Finnish create mode 100644 pandora/translations/French create mode 100644 pandora/translations/German create mode 100644 pandora/translations/Italian create mode 100644 pandora/translations/Norwegian create mode 100644 pandora/translations/Portuguese (Portugal) create mode 100644 pandora/translations/Russian create mode 100644 pandora/translations/Slovak create mode 100644 pandora/translations/Spanish create mode 100644 pandora/translations/Swedish create mode 100644 pandora/translations/Turkish create mode 100644 src/FastDelegate.h create mode 100644 src/Makefile.am create mode 100644 src/asfont.cpp create mode 100644 src/asfont.h create mode 100644 src/button.cpp create mode 100644 src/button.h create mode 100644 src/cpu.cpp create mode 100644 src/cpu.h create mode 100644 src/dirdialog.cpp create mode 100644 src/dirdialog.h create mode 100644 src/filedialog.cpp create mode 100644 src/filedialog.h create mode 100644 src/filelister.cpp create mode 100644 src/filelister.h create mode 100644 src/font-14.xcf create mode 100644 src/font.xcf create mode 100644 src/gmenu2x.cpp create mode 100644 src/gmenu2x.h create mode 100644 src/gp2x.h create mode 100644 src/iconbutton.cpp create mode 100644 src/iconbutton.h create mode 100644 src/imagedialog.cpp create mode 100644 src/imagedialog.h create mode 100644 src/inputdialog.cpp create mode 100644 src/inputdialog.h create mode 100644 src/inputmanager.cpp create mode 100644 src/inputmanager.h create mode 100644 src/jz4740.h create mode 100644 src/link.cpp create mode 100644 src/link.h create mode 100644 src/linkaction.cpp create mode 100644 src/linkaction.h create mode 100644 src/linkapp.cpp create mode 100644 src/linkapp.h create mode 100644 src/listview.cpp create mode 100644 src/listview.h create mode 100644 src/listviewitem.cpp create mode 100644 src/listviewitem.h create mode 100644 src/lr.xcf create mode 100644 src/menu.cpp create mode 100644 src/menu.h create mode 100644 src/menusetting.cpp create mode 100644 src/menusetting.h create mode 100644 src/menusettingbool.cpp create mode 100644 src/menusettingbool.h create mode 100644 src/menusettingdir.cpp create mode 100644 src/menusettingdir.h create mode 100644 src/menusettingfile.cpp create mode 100644 src/menusettingfile.h create mode 100644 src/menusettingimage.cpp create mode 100644 src/menusettingimage.h create mode 100644 src/menusettingint.cpp create mode 100644 src/menusettingint.h create mode 100644 src/menusettingmultistring.cpp create mode 100644 src/menusettingmultistring.h create mode 100644 src/menusettingrgba.cpp create mode 100644 src/menusettingrgba.h create mode 100644 src/menusettingstring.cpp create mode 100644 src/menusettingstring.h create mode 100644 src/messagebox.cpp create mode 100644 src/messagebox.h create mode 100644 src/pxml.cpp create mode 100644 src/pxml.h create mode 100644 src/selector.cpp create mode 100644 src/selector.h create mode 100644 src/selectordetector.cpp create mode 100644 src/selectordetector.h create mode 100644 src/settingsdialog.cpp create mode 100644 src/settingsdialog.h create mode 100644 src/sfontplus.cpp create mode 100644 src/sfontplus.h create mode 100644 src/sparsehash-1.6/AUTHORS create mode 100644 src/sparsehash-1.6/COPYING create mode 100644 src/sparsehash-1.6/ChangeLog create mode 100644 src/sparsehash-1.6/INSTALL create mode 100644 src/sparsehash-1.6/Makefile.am create mode 100644 src/sparsehash-1.6/NEWS create mode 100644 src/sparsehash-1.6/README create mode 100644 src/sparsehash-1.6/TODO create mode 100644 src/sparsehash-1.6/aclocal.m4 create mode 100644 src/sparsehash-1.6/configure.ac create mode 100644 src/sparsehash-1.6/doc/dense_hash_map.html create mode 100644 src/sparsehash-1.6/doc/dense_hash_set.html create mode 100644 src/sparsehash-1.6/doc/designstyle.css create mode 100644 src/sparsehash-1.6/doc/implementation.html create mode 100644 src/sparsehash-1.6/doc/index.html create mode 100644 src/sparsehash-1.6/doc/performance.html create mode 100644 src/sparsehash-1.6/doc/sparse_hash_map.html create mode 100644 src/sparsehash-1.6/doc/sparse_hash_set.html create mode 100644 src/sparsehash-1.6/doc/sparsetable.html create mode 100644 src/sparsehash-1.6/experimental/Makefile create mode 100644 src/sparsehash-1.6/experimental/README create mode 100644 src/sparsehash-1.6/experimental/example.c create mode 100644 src/sparsehash-1.6/experimental/libchash.c create mode 100644 src/sparsehash-1.6/experimental/libchash.h create mode 100755 src/sparsehash-1.6/google-sparsehash.sln create mode 100755 src/sparsehash-1.6/hashtable_unittest create mode 100644 src/sparsehash-1.6/m4/acx_pthread.m4 create mode 100644 src/sparsehash-1.6/m4/google_namespace.m4 create mode 100644 src/sparsehash-1.6/m4/namespaces.m4 create mode 100644 src/sparsehash-1.6/m4/stl_hash.m4 create mode 100644 src/sparsehash-1.6/m4/stl_hash_fun.m4 create mode 100644 src/sparsehash-1.6/m4/stl_namespace.m4 create mode 100755 src/sparsehash-1.6/missing create mode 100755 src/sparsehash-1.6/mkinstalldirs create mode 100755 src/sparsehash-1.6/packages/deb.sh create mode 100644 src/sparsehash-1.6/packages/deb/README create mode 100644 src/sparsehash-1.6/packages/deb/changelog create mode 100644 src/sparsehash-1.6/packages/deb/compat create mode 100644 src/sparsehash-1.6/packages/deb/control create mode 100644 src/sparsehash-1.6/packages/deb/copyright create mode 100644 src/sparsehash-1.6/packages/deb/docs create mode 100755 src/sparsehash-1.6/packages/deb/rules create mode 100644 src/sparsehash-1.6/packages/deb/sparsehash.dirs create mode 100644 src/sparsehash-1.6/packages/deb/sparsehash.install create mode 100755 src/sparsehash-1.6/packages/rpm.sh create mode 100644 src/sparsehash-1.6/packages/rpm/rpm.spec create mode 100755 src/sparsehash-1.6/simple_test create mode 100755 src/sparsehash-1.6/sparsetable_unittest create mode 100644 src/sparsehash-1.6/src/config.h create mode 100644 src/sparsehash-1.6/src/config.h.in create mode 100644 src/sparsehash-1.6/src/config.h.include create mode 100644 src/sparsehash-1.6/src/google/dense_hash_map create mode 100644 src/sparsehash-1.6/src/google/dense_hash_set create mode 100644 src/sparsehash-1.6/src/google/sparse_hash_map create mode 100644 src/sparsehash-1.6/src/google/sparse_hash_set create mode 100644 src/sparsehash-1.6/src/google/sparsehash/densehashtable.h create mode 100644 src/sparsehash-1.6/src/google/sparsehash/sparseconfig.h create mode 100644 src/sparsehash-1.6/src/google/sparsehash/sparsehashtable.h create mode 100644 src/sparsehash-1.6/src/google/sparsetable create mode 100644 src/sparsehash-1.6/src/google/type_traits.h create mode 100644 src/sparsehash-1.6/src/hashtable_unittest.cc create mode 100644 src/sparsehash-1.6/src/simple_test.cc create mode 100644 src/sparsehash-1.6/src/sparsetable_unittest.cc create mode 100644 src/sparsehash-1.6/src/stamp-h1 create mode 100644 src/sparsehash-1.6/src/time_hash_map.cc create mode 100644 src/sparsehash-1.6/src/type_traits_unittest.cc create mode 100644 src/sparsehash-1.6/src/windows/config.h create mode 100644 src/sparsehash-1.6/src/windows/google/sparsehash/sparseconfig.h create mode 100644 src/sparsehash-1.6/src/windows/port.cc create mode 100644 src/sparsehash-1.6/src/windows/port.h create mode 100644 src/sparsehash-1.6/src/words create mode 100755 src/sparsehash-1.6/time_hash_map create mode 100755 src/sparsehash-1.6/type_traits_unittest create mode 100755 src/sparsehash-1.6/vsprojects/hashtable_unittest/hashtable_unittest.vcproj create mode 100755 src/sparsehash-1.6/vsprojects/sparsetable_unittest/sparsetable_unittest.vcproj create mode 100755 src/sparsehash-1.6/vsprojects/time_hash_map/time_hash_map.vcproj create mode 100755 src/sparsehash-1.6/vsprojects/type_traits_unittest/type_traits_unittest.vcproj create mode 100644 src/surface.cpp create mode 100644 src/surface.h create mode 100644 src/surfacecollection.cpp create mode 100644 src/surfacecollection.h create mode 100644 src/textdialog.cpp create mode 100644 src/textdialog.h create mode 100644 src/textmanualdialog.cpp create mode 100644 src/textmanualdialog.h create mode 100644 src/tinyxml/tinystr.cpp create mode 100644 src/tinyxml/tinystr.h create mode 100644 src/tinyxml/tinyxml.cpp create mode 100644 src/tinyxml/tinyxml.h create mode 100644 src/tinyxml/tinyxmlerror.cpp create mode 100644 src/tinyxml/tinyxmlparser.cpp create mode 100644 src/touchscreen.cpp create mode 100644 src/touchscreen.h create mode 100644 src/translator.cpp create mode 100644 src/translator.h create mode 100644 src/utilities.cpp create mode 100644 src/utilities.h create mode 100644 src/wallpaperdialog.cpp create mode 100644 src/wallpaperdialog.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d03ea90 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,3 @@ +Massimiliano "Ryo" Torromeo +Testers: PokeParadox, Tripmonkey_uk, Goemon4 PSyMastR +Translators: Yodaz, superfly, pedator, NightShadow, Jozef, Esslan, Micket, fusion_power, johnnysnet, Waldteufel, Jontte, Atte, cowai, XaMMaX90, claus \ No newline at end of file diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5b6e7c6 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..c2236c8 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,154 @@ +----------- +New in 0.10 +----------- +Raised default clock to 136Mhz for F200 models (minimum frequency for touchscreen) +Fixed bug in link navigation +Support for additional utf8 characters +Restructured the virtual keyboard dialog with touchscreen support +New translations: Basque, Catalan, Turkish +Added support for the touchscreen +Added support for f200 battery +Added internal explorer that can launch .gpu .gpe and .sh files +Added graphic indicators for switching sections +Added on screen help (keep pressed A, only on the main screen at the moment) +Cpu clock raised when loading manuals +Added support for bmp and jpg/jpeg files for manuals +Added preview of images when selecting icons +Added option to show the root folder in the selection dialogs +Fixed bug that prevented the use of the custom selected wallpaper on restart +Lots of fixes + +---------- +New in 0.9 +---------- +Added gamma setting (global and per-link) +Added option to tweak ram timings +Added skins support +Added link to activate tv-out +Added support for multiple wallpapers +Color of message dialogs changeable by skins +Automatic icon association for links with icons found in the skin "icons" directory +Adding a link to a file without gpu or gpe extension automatically enables the wrapper feature +Added support for translations (Italian, Danish, Dutch, Spanish, German, French, Finnish, Portuguese, Swedish, Slovak, Norwegian and Russian included) +Use of a new font code which supports (some) utf8 characters +Added graphics for gp2x buttons +Moved screenshot in the selector under the text +[selFullPath] is automatically added at the end of the params when using the selector and no [marker] is specified +Easier access to the last row of links +Moved manual indicator to the bottom bar +Save screenshot with A+L+R (only on the main screen) +SD corruption when using USB on certain setups should be fixed +Fixed half tv-out screen +Fixed flickering in various locations +Fixed bugs in the manuals navigation system +Other small changes + +------------ +New in 0.8.1 +------------ +Fixed crash on section creation. +Fixed moving links between sections. +Fixed creating links in the first section. +Fixed alpha support for font.png + +---------- +New in 0.8 +---------- +Added support for game manuals (.man.png, .man.txt or readmes) +Implemented link's output logs with a log viewer (Disabled by default) +Implemented a simple text reader used in various situations +Implemented volume control (per-link and globally) +Added some confirmation dialogs +Changed cancel button from A to X +Added link to mount nand on usb with a dialog notification if usb is used for networking +Implemented virtual links (gmenu2x settings, usb, log viewer, about) +Added messageboxes +Added links for firmware 2.1.x +Directories browseable from selector +Added a blending effect to selector screenshots. +Updated the README with basic instructions (website is still recommended) +Fixed some minor bugs. + +---------- +New in 0.7 +---------- +GMenu2X always returns to last section/game/selector used (until shutdown) +New params magic value: [selFullPath] which equals [selPath][selFile][selExt] +Params magic values ([selFile] & Co.) are now automatically escaped, so quotes are not needed (and may cause problems) +Added support for an optional alias file for the selector that display the full name of roms. +Fixed bug with links with special characters. +Removed some unneeded savings. +Number of rows and columns on the links page configurable. +Various little fixes and tweaks + +---------- +New in 0.6 +---------- +Implemented link scanner +Added options to links for using a selector with them +Initial support for usbnet, ftp, telnet, samba and web server +Battery led indicates disk writes (don't turn the gp2x off while the led is on) +L = PageUp, R = PageDown in lists +Raised maximum hardcoded clock to 325Mhz and default gmenu2x clock to 100Mhz +Improved virtual keyboard +Sorting functions are now case unsensitive (filebrowser, dirdialog, selector) +Wrapper script removed and fixed a related bugs (wrapper function is still available) +Link's section changeable +All link's features are configurable from the interface +Battery indicator refined +File selector starts from /mnt instead of /mnt/sd +Fixed support for fonts of different size + +---------- +New in 0.5 +---------- +Added context-menu option to change link icon +Added options to configure top bar, bottom bar and selection color separately. +Readded support for imgs/selection.png (used only if present) +GMenu2X is now working at 50Mhz (configurable) +Added ability to set the maximum overclock to use with links (hardcoded maximum remains 300Mhz) +Moved under/overclock functions in gmenu2x (no need for cpu_speed binary) +"Save last selection" feature disableable + +---------- +New in 0.4 +---------- +Fixed flickering in context menu +Fixed bug that prevented correct launch of some applications +Interface color configurable (START brings up an options menu) (removed img/selection.png) +Saves and restores last selected section and link +Added global config file +Sections with no icon are displayed with a default one (icons/section.png) +Added virtual keyboard for editing title and description of links +Links created through file browser are truncated if too long + +---------- +New in 0.3 +---------- +Links creatable in-menu using a file browser +Links deletable in-menu +Icon associated with gpu/gpe is used when no icon is specified +Dithered background +Added battery status indicator +Added a menu with options binded to the select button +Clock setting is saved when changed +Links area scrollable to allow more than 24 links per section +Fix for links with DOS line-endings +Increased space between icons + +------------ +New in 0.2.1 +------------ +No more crash in presence of a section with no valid links +Keys and values in links are now trimmed. This means that you can spaces before and after keys and values (IE: " exec = /path/to/link.gpe " is valid) +Split applications section in applications and settings and added settings/exit link that launches the original frontend. +L and R shoulder buttons swapped + +---------- +New in 0.2 +---------- +Interface completely redesigned, now there are 24 links visible at the same time. +Display of free space on sd +In-Menu Under/Overclocker using the included utility by god_at_hell, Hermes/PS2Reality, Robster, Vimacs (edit script/cpuspeed.sh to tweak other parameteres besides clock speed) +Any number of sections supported +Customisation made simplier (just replace bg.png with any wallpaper of size 320x240) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..bac90c3 --- /dev/null +++ b/INSTALL @@ -0,0 +1,8 @@ +To compile the sourcecode you need to set the GP2XDEV environment variable and probably edit the Makefile present in the src folder. +This is an example environment: + +# export GP2XDEV="/usr/local/gp2xdev" +# export PATH="$PATH:${GP2XDEV}/bin" + +=== Installation === +Put the file "autorun.gpu" and the folder "gmenu2x" on the root of your sd, create the links as described on the documentation present on the website (http://gmenu2x.sourceforge.net) and boot your gp2x. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..948a117 --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..140a2cf --- /dev/null +++ b/README.txt @@ -0,0 +1,26 @@ +[Introduction] +GMenu2X is a replacement for the official frontend for the gp2x released under the GNU GPL license. + +[Installation] +Copy the file autorun.gpu and the directory gmenu2x/ to the root of your sd card. +Verify that the autorun option in the standard gp2x interface is enabled. +(Re)Boot your gp2x and enjoy GMenu2X. + +[Controls] +X, Stick left: Goes up one directory in file browser. +X: Cancel action. +B, Stick press: Launch selected link / Confirm action. +L, R: Switch between sections - PageUp/PageDown on lists. +Y: Bring up the manual/readme. +VOLDOWN: Decrease cpu clock. +VOLUP: Increase cpu clock. +VOLDOWN+VOLUP: Reset clock. +A+VOLDOWN: Decrease volume for the selected link. +A+VOLUP: Increase volume for the selected link. +A+VOLDOWN+VOLUP: Reset volume for the selected link. +SELECT: Bring up the contextual menu. +START: GMenu2X options. + +[Contacts] +Developed by Massimiliano Torromeo +Visit the homepage at http://gmenu2x.sourceforge.net for more info. diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..38d8b0f --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,168 @@ +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN(AM_PATH_SDL, +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_PATH_PROG(SDL_CONFIG, sdl-config, no) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..55ff843 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,952 @@ +# generated automatically by aclocal 1.11 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],, +[m4_warning([this file was generated for autoconf 2.64. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/autorun.gpu b/autorun.gpu new file mode 100644 index 0000000..2e1f87a --- /dev/null +++ b/autorun.gpu @@ -0,0 +1,3 @@ +#!/bin/sh +cd /mnt/sd/gmenu2x +exec ./gmenu2x diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..07fb069 --- /dev/null +++ b/configure.in @@ -0,0 +1,30 @@ +AC_INIT(configure.in) +AM_INIT_AUTOMAKE(gmenu2x, 0.1) + +AC_ISC_POSIX +AC_PROG_CC +AC_HEADER_STDC +AC_PROG_CPP +AC_PROG_CXX +AC_PROG_CXXCPP + +AC_LANG_CPLUSPLUS + +# Check for SDL +SDL_VERSION=1.2.8 +AM_PATH_SDL($SDL_VERSION, :, + AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])) + +AC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([ +*** Unable to find SDL_image libary with PNG support +(http://www.libsdl.org/projects/SDL_image/) +])) + +AC_ARG_WITH(sdl-gfx-prefix, + [ --with-sdl-gfx-prefix=DIR specify where SDL_gfx library is installed], + [SDL_GFX_PREFIX="$withval"]) + +AC_CHECK_LIB(SDL_gfx, rotozoomSurfaceXY,,check_sdl_gfx="no") + + +AC_OUTPUT(Makefile src/Makefile) diff --git a/pandora/gmenu2x.conf b/pandora/gmenu2x.conf new file mode 100644 index 0000000..a50a59c --- /dev/null +++ b/pandora/gmenu2x.conf @@ -0,0 +1,18 @@ +lang="English" +tvoutEncoding="PAL" +wallpaper="skins/Default/wallpapers/pandora-nova-desat.png" +skin="Default" +resolutionX=800 +section=3 +menuClock=100 +resolutionY=480 +outputLogs=0 +maxClock=300 +link=0 +globalVolume=0 +globalVolume=67 +saveSelection=1 +globalVolume=0 +gamma=10 +globalVolume=0 +videoBpp=24 diff --git a/pandora/input.conf.gp2x b/pandora/input.conf.gp2x new file mode 100644 index 0000000..203b56b --- /dev/null +++ b/pandora/input.conf.gp2x @@ -0,0 +1,14 @@ +a=joystickbutton,0,12 +b=joystickbutton,0,13 +x=joystickbutton,0,14 +y=joystickbutton,0,15 +l=joystickbutton,0,10 +r=joystickbutton,0,11 +select=joystickbutton,0,9 +start=joystickbutton,0,8 +volup=joystickbutton,0,16 +voldown=joystickbutton,0,17 +up=joystickbutton,0,0 +down=joystickbutton,0,4 +left=joystickbutton,0,2 +right=joystickbutton,0,6 diff --git a/pandora/input.conf.xbox360 b/pandora/input.conf.xbox360 new file mode 100644 index 0000000..bc3e89f --- /dev/null +++ b/pandora/input.conf.xbox360 @@ -0,0 +1,23 @@ +a=joystickbutton,0,2 +b=joystickbutton,0,1 +b=keyboard,13 +b=keyboard,271 +x=joystickbutton,0,0 +x=keyboard,8 +y=joystickbutton,0,3 +l=joystickbutton,0,4 +l=keyboard,49 +r=joystickbutton,0,5 +r=keyboard,50 +select=joystickbutton,0,10 +start=joystickbutton,0,6 +volup=joystickaxys,0,5,10000 +voldown=joystickaxys,0,2,10000 +up=joystickaxys,0,1,-10000 +up=keyboard,273 +down=joystickaxys,0,1,10000 +down=keyboard,274 +left=joystickaxys,0,0,-10000 +left=keyboard,276 +right=joystickaxys,0,0,10000 +right=keyboard,275 \ No newline at end of file diff --git a/pandora/scripts/services.sh b/pandora/scripts/services.sh new file mode 100755 index 0000000..b8ddf37 --- /dev/null +++ b/pandora/scripts/services.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# $1 = ip +# $2 = inet +# $3 = samba +# $4 = web +insmod net2272 +insmod g_ether +ifconfig usb0 $1 netmask 255.255.255.0 up +# route add default gw $defaultgw +if [ $2 = "on" ]; then /etc/init.d/inet start; fi +if [ $3 = "on" ]; then smbd; fi +if [ $4 = "on" ]; then thttpd; fi diff --git a/pandora/scripts/usboff.sh b/pandora/scripts/usboff.sh new file mode 100755 index 0000000..4b230e0 --- /dev/null +++ b/pandora/scripts/usboff.sh @@ -0,0 +1,11 @@ +#!/bin/bash +export PATH=$PATH:/sbin +rmmod g_file_storage +rmmod net2272 +if [ $1 = "nand" ]; then + mount /mnt/nand || mount -o remount,rw /mnt/nand +elif [ $1 = "root" ]; then + mount -o remount,rw / +else + mount /mnt/sd || mount -o remount,rw /mnt/sd +fi diff --git a/pandora/scripts/usbon.sh b/pandora/scripts/usbon.sh new file mode 100755 index 0000000..2196730 --- /dev/null +++ b/pandora/scripts/usbon.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# $1 = sd|nand|root +# defaults to sd (compatible with previous versions) +export PATH=$PATH:/sbin +modprobe net2272 +if [ $1 = "nand" ]; then + umount /mnt/nand || mount -o remount,loop,ro /mnt/nand + modprobe g_file_storage file=/dev/loop/7 +elif [ $1 = "root" ]; then + mount -o remount,loop,ro / + modprobe g_file_storage file=/dev/mtdblock/3 +else + umount /mnt/sd || mount -o remount,loop,ro /mnt/sd + modprobe g_file_storage file=/dev/mmcsd/disc0/disc +fi diff --git a/pandora/sections/applications/ebook b/pandora/sections/applications/ebook new file mode 100644 index 0000000..7667546 --- /dev/null +++ b/pandora/sections/applications/ebook @@ -0,0 +1,6 @@ +title=eBook +icon=skin:icons/ebook.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun --enable-terminate --view-ebook +clock=75 +wrapper=true diff --git a/pandora/sections/applications/mplayer b/pandora/sections/applications/mplayer new file mode 100644 index 0000000..17241b2 --- /dev/null +++ b/pandora/sections/applications/mplayer @@ -0,0 +1,5 @@ +title=Movies +icon=skin:icons/mplayer.png +exec=/usr/gp2x/mplayer +clock=200 +wrapper=true diff --git a/pandora/sections/applications/music b/pandora/sections/applications/music new file mode 100644 index 0000000..1f0ff6c --- /dev/null +++ b/pandora/sections/applications/music @@ -0,0 +1,5 @@ +title=Music +icon=skin:icons/music.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun --enable-terminate --view-music +clock=75 diff --git a/pandora/sections/applications/photo b/pandora/sections/applications/photo new file mode 100644 index 0000000..9259b58 --- /dev/null +++ b/pandora/sections/applications/photo @@ -0,0 +1,6 @@ +title=Photo +icon=skin:icons/photo.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun --enable-terminate --view-photo +clock=100 +wrapper=true diff --git a/pandora/sections/emulators/Amiga b/pandora/sections/emulators/Amiga new file mode 100755 index 0000000..9b291ff --- /dev/null +++ b/pandora/sections/emulators/Amiga @@ -0,0 +1,5 @@ +title=Amiga +description=UAE-2X +exec=/mnt/sd/uae2x_01alpha/uae2x-tweak.gpe +manual=fonttest.txt +clock=200 diff --git a/pandora/sections/emulators/GBAdvance b/pandora/sections/emulators/GBAdvance new file mode 100755 index 0000000..a560f65 --- /dev/null +++ b/pandora/sections/emulators/GBAdvance @@ -0,0 +1,9 @@ +title=gpSP +description=vba2xg +icon=/mnt/sd/Icons/Videogames/gba-purple.png +exec=/mnt/sd/vba2x/vba.gpe +clock=280 +selectordir=/mnt/sd/roms/gba/ +selectorfilter=.zip,.vba +selectorscreens=/mnt/sd/roms/gba +wrapper=true diff --git a/pandora/sections/emulators/GameBoy b/pandora/sections/emulators/GameBoy new file mode 100755 index 0000000..12b86fc --- /dev/null +++ b/pandora/sections/emulators/GameBoy @@ -0,0 +1,6 @@ +title=GameBoy +description=Gnuboy2x +icon=/mnt/sd/Icons/Videogames/gb-silver.png +exec=/mnt/sd/gnuboy2x/Gnuboy2x.gpe +manual=/mnt/sd/gnuboy2x/readme.txt +clock=180 diff --git a/pandora/sections/emulators/Genesis b/pandora/sections/emulators/Genesis new file mode 100755 index 0000000..e44c4d0 --- /dev/null +++ b/pandora/sections/emulators/Genesis @@ -0,0 +1,9 @@ +title=Genesis +description=PicoDrive +icon=/mnt/sd/Icons/Videogames/genesis.png +exec=/mnt/sd/PicoDrive/PicoDrive.gpe +params=-menu " " [selFullPath] +clock=160 +selectordir=/mnt/sd/roms/genesis/ +selectorscreens=/mnt/sd/screens/genesis +wrapper=true diff --git a/pandora/sections/emulators/Mame b/pandora/sections/emulators/Mame new file mode 100755 index 0000000..cc52062 --- /dev/null +++ b/pandora/sections/emulators/Mame @@ -0,0 +1,10 @@ +title=MAME +description=Multiple Arcade Machine Emulator +icon=/mnt/sd/mamegp2x/mame.png +exec=/mnt/sd/mamegp2x/mame.gpe +params=[selFile] +manual=/mnt/sd/mamegp2x/mame.man.png +clock=200 +selectordir=/mnt/sd/mamegp2x/roms/ +selectorscreens=/mnt/sd/mamegp2x/screen +selectoraliases=/mnt/sd/mame.alias diff --git a/pandora/sections/emulators/NK SNES b/pandora/sections/emulators/NK SNES new file mode 100755 index 0000000..179f850 --- /dev/null +++ b/pandora/sections/emulators/NK SNES @@ -0,0 +1,5 @@ +title=NK SNES +description=Super Nintendo Emulator +icon=/mnt/sd/Icons/Videogames/snes.png +exec=/mnt/sd/snes-mod/snesgp2x.gpe +clock=200 diff --git a/pandora/sections/emulators/NeoGeo b/pandora/sections/emulators/NeoGeo new file mode 100755 index 0000000..0081560 --- /dev/null +++ b/pandora/sections/emulators/NeoGeo @@ -0,0 +1,5 @@ +title=Neo Geo +description=GnGeo2X +icon=/mnt/sd/Icons/Videogames/neogeo.png +exec=/mnt/sd/neogeo/rage2x.gpe +clock=200 diff --git a/pandora/sections/emulators/NeoGeo Pocket b/pandora/sections/emulators/NeoGeo Pocket new file mode 100755 index 0000000..c616a9c --- /dev/null +++ b/pandora/sections/emulators/NeoGeo Pocket @@ -0,0 +1,9 @@ +title=NeoGeo Pocket +description=Race! +icon=/mnt/sd/Icons/Videogames/ngpc white.png +exec=/mnt/sd/ngpc/race +clock=160 +selectordir=/mnt/sd/roms/ngpc/ +selectorfilter=.ngp,.ngc +selectorscreens=/mnt/sd/screens/ngpc +wrapper=true diff --git a/pandora/sections/emulators/Nintendo b/pandora/sections/emulators/Nintendo new file mode 100755 index 0000000..9378657 --- /dev/null +++ b/pandora/sections/emulators/Nintendo @@ -0,0 +1,9 @@ +title=Nintendo +description=GpFCE +icon=/mnt/sd/Icons/Videogames/nes.png +exec=/mnt/sd/GpFce/gpfce +clock=200 +selectordir=/mnt/sd/roms/nes/ +selectorfilter=.nes,.zip +selectorscreens=/mnt/sd/screens/nes +wrapper=true diff --git a/pandora/sections/emulators/PcEngine b/pandora/sections/emulators/PcEngine new file mode 100755 index 0000000..644e59a --- /dev/null +++ b/pandora/sections/emulators/PcEngine @@ -0,0 +1,5 @@ +title=PcEngine +description=gp2xengine +icon=/mnt/sd/Icons/Videogames/tg16.png +exec=/mnt/sd/gp2xengine/gp2xengine.gpe +clock=200 diff --git a/pandora/sections/emulators/PlayStation b/pandora/sections/emulators/PlayStation new file mode 100755 index 0000000..ec48745 --- /dev/null +++ b/pandora/sections/emulators/PlayStation @@ -0,0 +1,5 @@ +title=PlayStation +description=psx4gp2x +icon=/mnt/sd/Icons/Videogames/psx.png +exec=/mnt/sd/psx4gp2x/psx4all.gpe +clock=200 diff --git a/pandora/sections/emulators/SSnes b/pandora/sections/emulators/SSnes new file mode 100755 index 0000000..3058bb2 --- /dev/null +++ b/pandora/sections/emulators/SSnes @@ -0,0 +1,9 @@ +title=SNES +description=SquidgeSnes +icon=/mnt/sd/Icons/Videogames/snes.png +exec=/mnt/sd/snes/squidgesnes.gpe +params=ntrd load=[selFullPath] +clock=240 +selectordir=/mnt/sd/roms/snes/ +selectorscreens=/mnt/sd/screens/snes +wrapper=true diff --git a/pandora/sections/emulators/fishyNES b/pandora/sections/emulators/fishyNES new file mode 100755 index 0000000..f70f035 --- /dev/null +++ b/pandora/sections/emulators/fishyNES @@ -0,0 +1,4 @@ +title=fishyNES +icon=/mnt/sd/Icons/Videogames/nes.png +exec=/mnt/sd/nes/fishyNES.gpe +clock=200 diff --git a/pandora/sections/emulators/hu6280 b/pandora/sections/emulators/hu6280 new file mode 100755 index 0000000..aeb3105 --- /dev/null +++ b/pandora/sections/emulators/hu6280 @@ -0,0 +1,5 @@ +title=HU6280 +description=PcEngine emulator +icon=/mnt/sd/Icons/Videogames/tg16.png +exec=/mnt/sd/pcengine/hu6280.gpe +clock=200 diff --git a/pandora/sections/games/Barrage b/pandora/sections/games/Barrage new file mode 100755 index 0000000..72ced33 --- /dev/null +++ b/pandora/sections/games/Barrage @@ -0,0 +1,3 @@ +title=Barrage +exec=/mnt/sd/barrage/Barrage.gpe +clock=200 diff --git a/pandora/sections/games/CDogs b/pandora/sections/games/CDogs new file mode 100755 index 0000000..5ad8b3b --- /dev/null +++ b/pandora/sections/games/CDogs @@ -0,0 +1,4 @@ +title=CDogs +icon=/mnt/sd/Icons/cdogssp2.png +exec=/mnt/sd/CDogs/CDogs.gpe +clock=200 diff --git a/pandora/sections/games/ClonkFront b/pandora/sections/games/ClonkFront new file mode 100755 index 0000000..6163d87 --- /dev/null +++ b/pandora/sections/games/ClonkFront @@ -0,0 +1,4 @@ +title=Clonk2X +icon=/mnt/sd/Icons/clonk.png +exec=/mnt/sd/Clonk2X/ClonkFront.gpe +clock=200 diff --git a/pandora/sections/games/Nethack b/pandora/sections/games/Nethack new file mode 100755 index 0000000..7c216df --- /dev/null +++ b/pandora/sections/games/Nethack @@ -0,0 +1,3 @@ +title=Nethack +icon=/mnt/sd/nethack/Nethack.png +exec=/mnt/sd/nethack/Nethack.gpe diff --git a/pandora/sections/games/PaybackDemo b/pandora/sections/games/PaybackDemo new file mode 100755 index 0000000..b44781f --- /dev/null +++ b/pandora/sections/games/PaybackDemo @@ -0,0 +1,5 @@ +title=Payback +icon=/mnt/sd/PaybackDemo/PaybackDemo.png +exec=/mnt/sd/PaybackDemo/PaybackDemo +clock=200 +wrapper=true diff --git a/pandora/sections/games/S-Tris 2 b/pandora/sections/games/S-Tris 2 new file mode 100755 index 0000000..a1d4bf8 --- /dev/null +++ b/pandora/sections/games/S-Tris 2 @@ -0,0 +1,2 @@ +title=S-Tris 2 +exec=/mnt/sd/s-tris/S-Tris 2.gpe diff --git a/pandora/sections/games/beat2x b/pandora/sections/games/beat2x new file mode 100755 index 0000000..8b2018a --- /dev/null +++ b/pandora/sections/games/beat2x @@ -0,0 +1,4 @@ +title=Beat2X +description=DanceDance style game +icon=/mnt/sd/beat2x/beat2x.png +exec=/mnt/sd/beat2x/beat2x.gpe diff --git a/pandora/sections/games/blazar b/pandora/sections/games/blazar new file mode 100755 index 0000000..276d345 --- /dev/null +++ b/pandora/sections/games/blazar @@ -0,0 +1,4 @@ +title=blazar +icon=/mnt/sd/Blazar/blazar.png +exec=/mnt/sd/Blazar/blazar.gpe +clock=199 diff --git a/pandora/sections/games/duke3d b/pandora/sections/games/duke3d new file mode 100755 index 0000000..80e79dc --- /dev/null +++ b/pandora/sections/games/duke3d @@ -0,0 +1,4 @@ +title=duke3d +icon=/mnt/sd/Icons/duke3ddp1.png +exec=/mnt/sd/duke2x/duke3d.gpe +clock=140 diff --git a/pandora/sections/games/hexahop b/pandora/sections/games/hexahop new file mode 100755 index 0000000..2b668d7 --- /dev/null +++ b/pandora/sections/games/hexahop @@ -0,0 +1,3 @@ +title=hexahop +icon=/mnt/sd/hex-a-hop/hexahop.png +exec=/mnt/sd/hex-a-hop/hexahop.gpe diff --git a/pandora/sections/games/ladykiller b/pandora/sections/games/ladykiller new file mode 100755 index 0000000..2736a08 --- /dev/null +++ b/pandora/sections/games/ladykiller @@ -0,0 +1,3 @@ +title=ladykiller +exec=/mnt/sd/ladykiller/ladykiller.gpe +clock=200 diff --git a/pandora/sections/games/myriad b/pandora/sections/games/myriad new file mode 100755 index 0000000..9849bb5 --- /dev/null +++ b/pandora/sections/games/myriad @@ -0,0 +1,3 @@ +title=myriad +icon=/mnt/sd/Myriad/myriad.png +exec=/mnt/sd/Myriad/myriad.gpe diff --git a/pandora/sections/games/openglad b/pandora/sections/games/openglad new file mode 100755 index 0000000..0f35550 --- /dev/null +++ b/pandora/sections/games/openglad @@ -0,0 +1,5 @@ +title=openglad +icon=/mnt/sd/Icons/exultsx6.png +exec=/mnt/sd/openglad2x/openglad +clock=200 +dontleave=true diff --git a/pandora/sections/games/openjazz b/pandora/sections/games/openjazz new file mode 100755 index 0000000..62f55c0 --- /dev/null +++ b/pandora/sections/games/openjazz @@ -0,0 +1,3 @@ +title=OpenJazz +description=Jazz Jazkrabbit Port +exec=/mnt/sd/openjazz/openjazz.gpe diff --git a/pandora/sections/games/puzzleland b/pandora/sections/games/puzzleland new file mode 100755 index 0000000..05b4232 --- /dev/null +++ b/pandora/sections/games/puzzleland @@ -0,0 +1,5 @@ +title=puzzleland +icon=/mnt/sd/puzzleland/puzzleland.png +exec=/mnt/sd/puzzleland/puzzleland +clock=200 +wrapper=true diff --git a/pandora/sections/games/rubido b/pandora/sections/games/rubido new file mode 100755 index 0000000..2571d2f --- /dev/null +++ b/pandora/sections/games/rubido @@ -0,0 +1,5 @@ +title=rubido +icon=/mnt/sd/rubido/rubido.png +exec=/mnt/sd/rubido/rubido.gpe +clock=200 +wrapper=true diff --git a/pandora/sections/games/scummvm b/pandora/sections/games/scummvm new file mode 100755 index 0000000..8f9c1d1 --- /dev/null +++ b/pandora/sections/games/scummvm @@ -0,0 +1,5 @@ +title=Scumm +description=Scumm emulator +icon=/mnt/sd/Icons/scummvmpq9.png +exec=/mnt/sd/scummvm/scummvm.gpe +clock=200 diff --git a/pandora/sections/games/smashgp b/pandora/sections/games/smashgp new file mode 100755 index 0000000..b87535f --- /dev/null +++ b/pandora/sections/games/smashgp @@ -0,0 +1,3 @@ +title=SmashGp2x +description=Super Smash Bros. Clone +exec=/mnt/sd/SmashGp2x.gpe diff --git a/pandora/sections/games/smw b/pandora/sections/games/smw new file mode 100755 index 0000000..56f93f1 --- /dev/null +++ b/pandora/sections/games/smw @@ -0,0 +1,6 @@ +title=SMW +description=Super Mario War +icon=/mnt/sd/Icons/Characters/Mario.png +exec=/mnt/sd/smw/smw.gpe +clock=200 +gamma=76 diff --git a/pandora/sections/games/sokoban b/pandora/sections/games/sokoban new file mode 100755 index 0000000..c260a84 --- /dev/null +++ b/pandora/sections/games/sokoban @@ -0,0 +1,5 @@ +title=sokoban +icon=/mnt/sd/sokoban/sokoban.png +exec=/mnt/sd/sokoban/sokoban.gpe +clock=200 +wrapper=true diff --git a/pandora/sections/games/supertux b/pandora/sections/games/supertux new file mode 100755 index 0000000..d84810b --- /dev/null +++ b/pandora/sections/games/supertux @@ -0,0 +1,4 @@ +title=SuperTux +description=Platform Jump 'n' Run +icon=/mnt/sd/supertux/supertux.png +exec=/mnt/sd/supertux/supertux.gpe diff --git a/pandora/sections/games/vektar b/pandora/sections/games/vektar new file mode 100755 index 0000000..0f0bfba --- /dev/null +++ b/pandora/sections/games/vektar @@ -0,0 +1,5 @@ +title=Vektar +description=Commercial version demo +icon=/mnt/sd/Vektar Commercial Demo/vektar.png +exec=/mnt/sd/Vektar Commercial Demo/vektar.gpe +clock=200 diff --git a/pandora/sections/settings/exit b/pandora/sections/settings/exit new file mode 100755 index 0000000..1c79af4 --- /dev/null +++ b/pandora/sections/settings/exit @@ -0,0 +1,6 @@ +title=Exit +description=Exit GMenu2X to the official frontend +icon=skin:icons/exit.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun +clock=195 diff --git a/pandora/sections/settings/originalsettings b/pandora/sections/settings/originalsettings new file mode 100644 index 0000000..785eadf --- /dev/null +++ b/pandora/sections/settings/originalsettings @@ -0,0 +1,6 @@ +title=GP2X +description=Configure options from the original frontend +icon=skin:icons/configure.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun --enable-terminate --view-setting +wrapper=true diff --git a/pandora/sections/settings/system b/pandora/sections/settings/system new file mode 100644 index 0000000..4f0d5e1 --- /dev/null +++ b/pandora/sections/settings/system @@ -0,0 +1,6 @@ +title=System +description=Configure options from the original frontend +icon=skin:icons/configure.png +exec=/usr/gp2x/gp2xmenu +params=--disable-autorun --enable-terminate --view-system +wrapper=true diff --git a/pandora/skins/Default/icons/about.png b/pandora/skins/Default/icons/about.png new file mode 100755 index 0000000000000000000000000000000000000000..d56ba2c2449cb156979af2896e82be831f258d93 GIT binary patch literal 2671 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 GkpCaur}P*A literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/configure.png b/pandora/skins/Default/icons/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3b1f49d756e165d0953a895acf027fa1a86932 GIT binary patch literal 2857 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 Hu0mjfI2LzG literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/ebook.png b/pandora/skins/Default/icons/ebook.png new file mode 100755 index 0000000000000000000000000000000000000000..89ef01bad4e4b44c0f30aa1af7d18bb1742bd4e9 GIT binary patch literal 2805 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/exit.png b/pandora/skins/Default/icons/exit.png new file mode 100755 index 0000000000000000000000000000000000000000..08e97b40571c7d2b96a4e23862dad1e797f87c95 GIT binary patch literal 2446 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 sr-*^!3qSxd4s`DrAbh($ literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/generic.png b/pandora/skins/Default/icons/generic.png new file mode 100755 index 0000000000000000000000000000000000000000..135fd11b9fa7169d16fdcee3d090f8849a46c13f GIT binary patch literal 2853 zcmWlbc{rO{8^+(f35lJCqLiq$b}|OFCA3=0km*>`Y3CDaD=mh0f+8Df&?z;F(vmK^ zFrDf$EmI{X_NB>;Rw-=~wJ!~|1tH%%f1Go!bDe*l>-pX1e(roi&`}k|eTo18sQ4W_ zd>lG4|1Fd}w5Mfeu0jVQ4*wk<03LTc%N5K*cir{h7XU-8pi76xl(FsT~kbME7*^c+T20tVLYJBk<5=zd+?k9V;tixU(}7 z?&gMcF79L6wBV=i-_^Xsf+5rkpFC0FgK^AcfhXg$zD|uTE_`TiE&;~)PD}qXR7o5m zygX7UY=}wU{Ce|JMFobz#;C#d^w4#Y)`7UAOZgA#=MMo*RS=UqTVjEjKsuWU9}G1h zEZDfYxiJb0?YOgpN82(1kkv6VQZAb2iAkzhtd$ZWGVj3y3+^;ep!2C!){il1R|?9N z$*>OHJ^5G*%K|w1;JT)bjZM4o%a`_pmX=SaCi}FfC7W`qA)(h?AQ|+eO!k_3viEqA zW_GnTu98rySK#w76lQNwknP=&&ENtCgG(zcMC-&+bPPN)ZOFRN|r6#T3! z3ZC59DjFJ))1`B1!oUHMZkz6uYEgSS3SIJ#h{!BCUZ0<@*NZ3&^L8{}dIc%-Z z6BBRLH8m0PR{?&MZMu=dGyMv8UC-<-#lT}5)YUk4tpL}Q2P@5?oihT3*TTcXz$qP1CZsCR zqfMdzcE5Tu@GDSO#^GQ5x;Wl}O*=s(M)dU@1k(%}`y(L+B$WM3!;>crS3%1T;$E~F z!BuTtqgz9^>p(}3Us9{lwTjDN8n8b?NkG z-H?z{ENvFE{P9)zD6P64>Hm{FB&D#hux!F9`crv}?{_52g`&0jB98Ss^2QEsuaB}w zF4peIcWmFbhK6+c>})hU*;FSz9iti=67nd0NjP+~+)jY=Q569sl^*sjBd+@1slSV> ztNU-=yQh~v*_)B_8ic4nj%anEOuxCH#ujlJKc5EjReGlXLka zBTZVz{CeK?c6Yez|A@lG^@x>|1ue0Xt+f>obwkMasTbA+ z<#sja5L>?(+gsj))lUXyWSk*s^sA`m5V;c@$%GSjy~5eqwsgtT)uC79WM7$d^PDqb zK#2`%85q!T0RehOdU~f*d=L}y1U|#R9}*hF1Frbb{a^v`?CZ86#5zMU6~F;Br2`%w zr%4y)4|a8S>Z0mcI0f}Rt1^!10Sg!W6FqK& zNCg?q%_fb$(v@jDm;Ka#H7z!%)^bjPxZ2r)Dl#o^=uR9oDbkgn>S3rH)s$b>5gjqL zb#;Fr^z`(&<#rLY{6eKll*~s@^)l((ZVk-QhYz}8dJYBrf_#k|0;3CElz7paq5hb2 zk~H;9zmX>pzlEr#Dn@y~1Y&7AQ2sqxKo%rS$ zK?9K1K_=0qZ!j2+l5KUQ(TYr#%sxW7@E!Kp&D_qw@h7xP-Oq>^>p2D1>fhK9U$8-xqlsf*-ywd&&9pkYiV z{Vjr(C4j=lT$861ekxtz;5)3hkIJ5DCbLrce$akNYtBx|8?yM*P3h|FpfP(Qk$4+{ z!rU_rn4-=&Ck|QXH>Ze(!wEi!w+WH4vG6S^vT+^0iI{LBcmS5>q)B-90YVla zs0!xL7fg$D)E>1MrFwgV97pbr@592{mOghCRZ+*aY3psH003(T&mkR~GuOt)rUtB@ zArQIR35ivp&Be|X*{({8TTnnBiuk+$Hz;TPJRufw^6ScUa!Q{iXIG{)TmEnDzL@^vNn+1#5q6>i}0XJ+0%ZWUTIUEJ{GE`NSiQ{zQ> zfowuuf>8m`O}H?EPN5Cn4=%moM$R;{-%s_gBjcp-3Qx~0$x?#x-I#6ULSk50YzpX} zHsx*~Qv<(LN~3AnlPzdUw}We1uw#E+K*xV-@j6=cMT|Hkb$>92BmXD#{V7rjUK7ur zEWf&`s93HR;I}mno&nT&kkYDlWV)ihuT6bTNquP8hACy zE`6Q7J=Mpte!XXSF4R3o%2{|t7TW*?jDj({#(u~UeWUc%H8cj&XZSE@5{zfCImJb-p~CTX_)5xq#o1pu>N7lj#2kKJYr! literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/mplayer.png b/pandora/skins/Default/icons/mplayer.png new file mode 100755 index 0000000000000000000000000000000000000000..e2470fc4c84b8f57c36e5860fd484dc57733baa7 GIT binary patch literal 2291 zcmVQBm zWA~%2t^NP~`}hB6Wo3aZtOH^$kV1d}VxfX%96+o9#HO5_T-JhuLZ)tRu9{w69-LZQ z+6)^uY+|@~?;gXCAKw|o#pN07>|7aU&YWra_wQd(pq_^S0Yt6?gn`(Mfq~IUSy{>0 z%F5Ev$jDgW+O?YutgI|ROY9j!LqixqfqVY^6^8x$_b^$iHHb0$jHcQiin7b3J3_Y#l%E0czC#j74`K^1X{M6VcD|B z3`|TM4FCQyFznc|o#EukQ-6N^`0?)4sZ$Su%I*R2MIinH(gP4cxE#O+#JWIi&BeuK zB`GPTr>Ll`k(3nA=-^<_z{e-Z(ACw!aO>7hhP`|DF{rB>GJOC36Bx|D87^G7!0_eE zmw$&3A9?@&{o6-CGadu+T_C;%r9u4HK>P`05kLU3AjP8uDDiM|a=Hr%iP*WiI!gxz z2J!=a$*^wSI-mvLfx*kpAR;2g@a@|l1}-jshHKZZFto3$)}mgPNKaLr6#r*wPg%7XCYQXy3PA zzka;~rrrloAKnMzJ5c&55WfZDU!LopfIQMv5CH-R<^U@vCzm~nii(_< zE?s6|W@cs(65{{I!ou<$=;QD2-+%fERQwkhHGjFd*#H0g_wPSYjPcK(zl`kcY>WZ| zyucLykKyy@Z{V~7)W;ww$PYA!3FHxmPoKVk>|o&M=LJSLJ1CJd?c29+IneATfB=Fe z!uQ(R8ei(`8#zG*$FE;M87wU=nG6i{xc~h5!@YIuc7`WUo-!yYDKdC^x`Wfv@#Ci% z&YnFBv`CP_&(E8ImzS5};lsxa+qdroTjuWW!l0la547wXxG?(o@goD!JO*oPONK{} z9s#3R%?0RyWdH#La{$oOtZc%D7&bxrx^3GIdlwfMaJ&IaF9u*d zgVO{jCkNQ22hKiakP%^HP?zUt_{+cwPEWvS0y^#oxab9zmf+$TWG*QFL7@lI56tS| zw8_TC%#fU%#ISnx%9TKYMt}f%?0J6_W%LJgqA&i z{rU5c;qPCdi~juu(g+OVfBpW8K|+d`AvMN;;q`A;hQ@`!istka1`eP%SeO}5)MC>Q z!XSqLGZ6!{MEnO3K3$`X2C>lT*8T?~n1Q#|RfaTshU>WxHCn#M2 zgZ&?vt z{{?!DkrCAaU~!;fAT=O4Mx=zp3`&HcivHCn2DYy+8DzzOF#P@vEGyX9Q9J|j9Kuw9 z0KystAj{Dm@c%zBIDukJz=X)h&A`C<2jUS>D6j&v_?x#s7(U;+&0xy(kRjDum_c9H zkm2`V7N8?g!yIHTG5`o5tPX%h0eT34G_wJ-wvYfgHW+|~8^aG^qP%(T4uinU8w`1t z+zbxpdJHV=+zj7-0WJRj2O|+eLIV*600G2;sQ{4(ksZLq1W8aV%>NnWB_WCL%EcE9 zAAm)!uk=rbpaew*QE^dV+W5!t1C&5;fWLoHvjIQ=;YFBdFqFVqyhi77PQqfMsq? zs1gG&2e5G=z{l|OH_$gghcYuUgKI^?-9TU+49peK>KJS|Kmf6zxsK_@i{}h-a<3V_ ze*J>g5FSou22k1Z>g_8AMiSe9z%~cN?c1+G4H-~M{0wpvKmft2W0)F8V56fFSfxr3 z(XJyIfb9AC^Cu$^gPQD%fOs1~0HHeo1Z03%8rpEA75D*d=)MC8FaQVjrY8uPcDMil N002ovPDHLkV1oF(Ei3>4 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/music.png b/pandora/skins/Default/icons/music.png new file mode 100755 index 0000000000000000000000000000000000000000..a5a8d14e83c7678937cb4d1a500325caf763c6c5 GIT binary patch literal 3095 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 PW)F)9iw?cDg<0@_nNF(W literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/photo.png b/pandora/skins/Default/icons/photo.png new file mode 100755 index 0000000000000000000000000000000000000000..b443e1d4492fd4473ff4d2dccc2adc197614aa68 GIT binary patch literal 2605 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 lX<3FJaQGCZNenqN*haU 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 sz&u>b(T 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 LNkvXXu0mjfMcmqQ literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/icons/usb.png b/pandora/skins/Default/icons/usb.png new file mode 100755 index 0000000000000000000000000000000000000000..24338890f82f4b578ffb0815cfa61ab92cbf41e9 GIT binary patch literal 1910 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 jKS_Z;gWzNYL1~w!qKp0wf;j8qCOC9T z?3%@~g3vm2kisn`RnQcrg^LYp?%rJ9I|pCkxJDN@A9&&A<#`_7@AE#d#%QDgD{=M} z5J}?L2(boS+}LP6D$kWq1MI)wKU!YC@fdJ`C{ETB!cx6{clGwIm1|cnU#-jGu&8NT zady_8x2)-?RJu^!-FN+wIT8h`tiyxNPeZK zU+;W+_9p`k2*&O`I4`o3sg!A^L}5;f`Gs)c`4K=SlhL?;Cx|yVUgcB3C16qg#!(Q! sHt_a$k+eh}lfcwpvI&7>;Je!M6NBiMWPkN(;{X5v07*qoM6N<$g0s~CG5`Po literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/battery/2.png b/pandora/skins/Default/imgs/battery/2.png new file mode 100755 index 0000000000000000000000000000000000000000..89bfade52fbac8274646aa70feade19af5b4cbee GIT binary patch literal 605 zcmV-j0;2tiP)%s)3%7$zZ`9(eG0oO`(Up7R98BLXOaw=Q4= ziPD&20l2ueRePDgke>r+{A{#VS0B6rRKWF<#Xw=MTzmfsJalTIlt9>zbxL?{qp3Yqi<}AbaOLu;Fn>TyOz9olXyv z$)pLGvMigWQb`ANkE467yZ*V)gfk0_1nKI@#~bX5i=3OCr?(g8`v=K=d;J*TN7IO3 zdZA7hm@|Jp|J1UT*(nitJxM_R`_Gi3NlTPOOEmkIq<77*Js5@n zYzNVEW2}Gxn62E#q7;pVc0AsQ51xhiNtGzjh@6qI(;6m+L6*9GwlxE8u7 zT_koR67UnaXoVtD2y~J7r!=;-GBK$kGn2`iaWjQ5jotLZgU93C!@cL6Co#UlfaZJq z16Y1wa7?oVTwh$*N{we|;wVLAZuczg(CJ?tq08PHZ&->wvk#VeUiCQ+}~ z4=R<)_eP`9_b`qpt_;|I@g{+#YPDMEcDsv)VJx@X?YUa5b{SB-a|u}Tu%}#b0g+55 z2eDYp25d!9>{6*@0;Y#Cz0uwO+PERTpH+UDGYKV?YW13-k3ZLf#Se+U0R4R@`uTb1 z>>RYDofltzN5iQL>4_i5JH|nOw|64gWGWy7Z}2I9t~xh?e+9+rh@h5Si$#V@{YZKqL~8HhE@`CU`W;A>cM} y$NP=r$^tfk&66NWK0Ttq)EU}1KnLh~cm4r9{;<@Q;j}0K0000hAt|)lgX`qFnMeryLl+D9BQ2YZt3*vtvc-Y0( z-K6**OxO-%$RK#>RHS3lLArKIlQex3FBycic=6x^FTA`w-v_?W^Slz%p#nzY?F8_W z#MG2w3AnMj*?Lu(ugn4*d_6c`S$X&xuz)a5RuY5ddj09z<43Cx?%lm#7vphBlBCky zoO#PI3Sqf?y|Tam`4||)hvH&OySvtV!FP_9ij1IpRZMUnY0R-LI3~& literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/battery/5.png b/pandora/skins/Default/imgs/battery/5.png new file mode 100755 index 0000000000000000000000000000000000000000..cade2414fa7994bbbca8b794696f0b06ea26cb48 GIT binary patch literal 542 zcmV+(0^$9MP)QE zul|J|tWanv1cee$2Eme$T57tR&CGakg=LLiy!oDn;d>wE{l0Gm^W_3z;cg5h#X@_I zSpe5|cHTbkT-pO-R(Yk{OIBK#=X1uyJ|Lzgb>m4a_dGI z)=ay7rE_$2cmjOOoAR(b`}@5&VYt}vT$d!7GMU6ErHGRRrPSB;_0?@)7f{6r5{QmJ z_iDk&SJj}(a5QA_WuPzOpV5P=9|BQU`y0Rl!q*2chbxzFmYSDZ_VM7u^!>-(>G*u4 z0HhqZW37C)R9|pwm2#=kT)1dOazT?!TIh^U?DF11RYTBWz)$ zC5*I%ktLy}5herZ?CB<-`=9h50E(;ZC8x?xJ!Pe6YkH>bWTc%q))K&IEWrB{Kmh53 z`m?6*1TwG!S$D6imVZmfrPu&eDiyKE(=)u01ONa40830+0Q~&?03aV9cqk-McLN0r0tO26_WJqn z^Y!%Y>g(&|(dOpn%l-ZQ%I@y%*!lVP{_ybc0MyjU00IbX03#zK2=g+tusZzy`||fc z26h%fZb315c|{2kVSQBrK3?lTf4>4XTzR#1>yEXTE?wvVs(%F13lKnzpfKhcc${=Vve{`_ZbZtgt3bLV#7 zd-txs1qdK;7<~Wnh2i`6&wqLOI3Iui_W$v(KRk?o|8w&&F>`Z#|H=I5#k=2&X3bg> z)7a4PKuSuKAv!wT5@?wlNH0JDfxYnm|38NR|Nb!k{Q2Ei-$*A_RYTiSL{w6kjg^Dp z$Im|u@85s>qo|~Q{r%hLBBxGYXL$eaH89M6vVrsh1Q5i4fB)DxImDW6tRjmX9PL;n zBsm%Q`573Pf$sbDmx1BS7Y3GhA8d4=zxcv%`T7Hf<3}$rh=_{)1?dF{Ag}>{e)1@( z>p7Qt2DmeR`uv~a`i-9q|9`VHumkPjxAMuvZ1cp2Wle!_6)&c0h9y#N6Oc0r`(kL8oBj&pBV{-2>~hw$KyP4(>b4aOTX^Ur(MKF9GQV2p|SfIxv@E z-J4vAc}J%K!5=NH-|JA^gJOG00000NkvXXu0mjf^E0)~ literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/bottombar.png b/pandora/skins/Default/imgs/bottombar.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ec0b41d588dc4a289069648c9fe1fea2438c34 GIT binary patch literal 8453 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/a.png b/pandora/skins/Default/imgs/buttons/a.png new file mode 100755 index 0000000000000000000000000000000000000000..e3400f9498261b927b23d59d48550c5464b89676 GIT binary patch literal 3269 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 D&>ROg literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/b.png b/pandora/skins/Default/imgs/buttons/b.png new file mode 100755 index 0000000000000000000000000000000000000000..16de5be2362dc9c866690b4ea88fffbcbc9a912e GIT binary patch literal 3242 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 be7jx&@6p=gi$ZMN00000NkvXXu0mjf+Uebh literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/right.png b/pandora/skins/Default/imgs/buttons/right.png new file mode 100755 index 0000000000000000000000000000000000000000..1022430196a04652ca9c99a38d039e907276c6db GIT binary patch literal 3209 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/sectionl.png b/pandora/skins/Default/imgs/buttons/sectionl.png new file mode 100755 index 0000000000000000000000000000000000000000..210c7149b507021ae6bb7e589c1c76f9562e1175 GIT binary patch literal 3056 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 be7jx&@6p=gi$ZMN00000NkvXXu0mjf+Uebh literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/select.png b/pandora/skins/Default/imgs/buttons/select.png new file mode 100755 index 0000000000000000000000000000000000000000..a434bfaf66fe5bafe1393ffcb70780acb9e0389e GIT binary patch literal 3126 zcmV-649W9}P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0003|NklS6otP@L%=aml1wOB1=?Lf5S)$R z%7se>SH6OMpmys^6iUG-XxD;^bSD&wbW>p{!nn|pNh%uf!iBkK?m66_8DXvEKPK8H zYOROB7`OnYz-X~pyo4>ur@(x>-R4zQ(eL-K(=>Ap6~HAx z(4y?eqA2n>j+@s{elP~C=VPt)P$~81u)$zp0c$^}Znf5D{sOFTfOTXa^98<0bpe;8 zl-e~hcWw%}8BBx_--?}1=h#!`x3^MTqZ1KA)UY;oFoSNlYk$HITF_cYS(d#DA#fhY zF-j@&Jb(9b*D5gaTR1O@BJ<0UQj#ReK1q_B&1N%eR6Fv609Xe>fH4MR3}G13>-F}) z?Q*%C{ndL2JV#M9Da-QS7(<$-JKzqOYOQG_05FnLK1eBtzzkTo{iPoR0PhgPFrv-O QRsaA107*qoM6N<$g0P^=T>t<8 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/start.png b/pandora/skins/Default/imgs/buttons/start.png new file mode 100755 index 0000000000000000000000000000000000000000..89aa5501473cb011d2499962ba13bc37815377e2 GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/up.png b/pandora/skins/Default/imgs/buttons/up.png new file mode 100755 index 0000000000000000000000000000000000000000..eddb453a56764c3700ea19a13a29d10c97a14361 GIT binary patch literal 3206 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 P00000NkvXXu0mjfLdwN4 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/vol-.png b/pandora/skins/Default/imgs/buttons/vol-.png new file mode 100755 index 0000000000000000000000000000000000000000..085522b9b687e23bbfa30420535f84ce2ebc69a8 GIT binary patch literal 3058 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/x.png b/pandora/skins/Default/imgs/buttons/x.png new file mode 100755 index 0000000000000000000000000000000000000000..717d4290998902d2c4505f4d21f23a7e656a4db8 GIT binary patch literal 3241 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 bzvs^Yq@blEVtfTk00000NkvXXu0mjf;Y$7G literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/buttons/y.png b/pandora/skins/Default/imgs/buttons/y.png new file mode 100755 index 0000000000000000000000000000000000000000..759a2a7d4ff7f1aae9219d7e3cf81013213fccfc GIT binary patch literal 3308 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 UnbR)uUH||907*qoM6N<$g5U|oW&i*H literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/font.png b/pandora/skins/Default/imgs/font.png new file mode 100755 index 0000000000000000000000000000000000000000..cdccf51c1bbb07aa7e380b54f3e1a2203c491df8 GIT binary patch literal 7532 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/go-up.png b/pandora/skins/Default/imgs/go-up.png new file mode 100644 index 0000000000000000000000000000000000000000..de8c391c236691dfa177b1dbf1daa72fa1883179 GIT binary patch literal 781 zcmV+o1M>WdP)#m`)6()gXWQURj1Ex{MHh=Qgsg-twbl-Xf)XM` zL1Ac@PElEbd9g4g401I=jdEpu>+ZgP^WHS;Ggr?Je3=>eeLwtW<~sso44WAe7X%@U zje`k*d%g7FjwVGR(&v%chk(!w5PL%vYXI>ue3D6;1a9QA+b`FZhCjZq4Gs;RQX3n~ zZUJsL*MDnTnGWC+ffcUa4LP3D3qDRM&!^8F(@r$Ka@j?#^;)XJK9&bUPowdH@8%+{SRYd|&pi5L!L~hGBym z2B@yXF%8^!K8IgPhR%-iBA+bYgXKsWfKCq`Ke4y&{J9dmn*?$t8zE6gGN~iAY_9AJ zvVo^>=5eg10JW!!&vL-g)u&+CzNcq=Wb`-FP0A9w&6usTuD4Nk;La2)t{-Ptdw(!3 z8f7!H3oI5}WaATatZ;wt4EK7MNd1!9-t#p{ZO4G=Y`K5?upCf*-UV_gqJ+Ou6Ai7S zRJR>X^^2;hkjyJAE*Uk0FTUr&axD;{>B^;&li(&Zk%E~_fl(h8G!w60M?N4$uR$aV z@>FdNK!`By29#-JF>tyj%L0--0GgJB9#0{$?B_K>1h@I)iMTZm3J`I94uG{_Kolgx zmnvN3$P`%$g2PqZ=oT&`q$Zj8~O|dms!PI;TOoE&a zkf3<}3?Mtxh(!>&+xHDc`2ojuz3g)fW}~`jNMr^92`uBsroZz)$E7f??#YTK00000 LNkvXXu0mjfm@XO3g_kJVYzng`m5*9Up~2a@BW#iM-TOU z`}XxANDn{&F@Ow!VQXt^1|uUw9#2ot{*I2$_t&o7{QvFS&;Q@Q{{rG4|DQg6`@gGe z`hRY2-kC5x00G3pfCRX>xUy|*9P0i20!5XTRls6z-@a$~_U#A5vuE#sE@NU~WMpGt zW@Z+G=>Z5J6a&1yy}NRA^SM5K`p)p?%{zu4KYlTM`t+6I_3MuezkmN_5EBz+U}Iwi zDg6V}0}wz=$Odq8^Dw=B{ej`npI;10N>U6zfBt58{P;Bk3kx%YfB+8z4-Y5M02ZLr z8R2>W0tm$gfB*hvxP18@!}sss7%VJwz_xL7a{#@@$-u|X42Oxk@3}9qr zV&LcJ2D;!k(BD6Sd`6%lAU`vKHL|j@fH6=dTn|71p%}o#!~%>3HHKHO-hplV`0*=L zGb7kmPEK|PK0aQM!EiSK1Q3b=-@k)w2BiTuprZc_|Ni|4y8?uHczD2uJ$P^r7&bqD z!1MqF5Q+i+{xLAVd-nxs$X5mqp#T2>Lmm_k{QQEzXnexZ+uQMP{rVM0zkmPI57Pq> zKqv;hdGq?`?_b~8MMMP|eldPyVE)3y@a^4qhJE{XG0dMo^ux7vZqW&mCE52gno zfEbaJG8Y%Wzqpuax`C0Qk%5h#keZw!>!q`o8D`J!zx4L)YgZ8wkynC(0t_!-z5<5N zN3b4%076LzmX@X)Ma6`?UcPuHv3SbTh}Vyw{Z>(uXJBFHx@%)+|H{+T1DIdz88|pN z;CcW82*nG)%(Q@qmyef`jrW7Z`!f=5>UWs`FflW{_K>$_)sI@n$@-7|!TtMxn3$L* z1C<{E=>Z5J6a#d$4dYeSH5oqsVrP)K{*pmN_5lNfI3GjyH+_){l8%u={HzR$3U?V+ zty;+gO8Fo?00D#&20A)=tN#D{uMP~pUz)$)bNT6hmEh!NVB3F@`Rn0d5-&Je|Nr~@ o=MT$+2lrQf|NgxNqz53t013egTe~DWM4f9tB~m literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/l_enabled.png b/pandora/skins/Default/imgs/l_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f300d91b47a4584b985ddb9c34c1eb445bac44bd GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrev8v_I5hQMesAcwIy$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+w=f7ZGR&GI0Tg5}@$_|Nzs|$ND=nDrak~vDG}F_?F~s8Z z+2GT>tp+@s1%nN^l@HjQxga=$*{x!8NpAty6qbsq4i{ur9V-fc&b~xVDR^n$eu+zE z0fp}8OTrd+7k%C|x$I~8!32*D1yS3@4ooo0{9G4rbMoEG8A?X=(*jK*N|@a?rEk*N zrW;*-V*WlkMiYzeE1K4MFkA>Zu_dUZ%!TV>#BNbzt5TlV${U_E*?aNSS16h*h#i?^ VF+=yGp%l=O44$rjF6*2UngA$jVAB8q literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/manual.png b/pandora/skins/Default/imgs/manual.png new file mode 100755 index 0000000000000000000000000000000000000000..ecdc9917ca2ef1fc3ec65de8b9ce52aee8566d4a GIT binary patch literal 978 zcmV;@11-&e)KaiFkNQ&4OIJ&k>UUQN(O)cVnH$P*WYv{9fdw$UwtlB6&Z$4Uw$!s`Sy?D z=O0$_o3~yhp5A*V_T}}P)j%uzfU5t1v;YJU!hoND)6Ee?xTPIe*I_% z=>-TNNIGC)x%B+ny^2p4&ojtN@iB1mvN42tNizKS%gk{5`EP~*FC_+HMNtMe9#MvW z_g*mkdVIePn52(`v;qVWBqcHeozBEC@!^T{tU|Bew~48#Fz&nfnPJ1xx4<;Qe@#_!*M{%>iin+*^^EGjDUXQZSgg#P~h`wya#5oj(G10y37*nofk{{DUb{0+B` zp)QNKgeb$$pFbJc**O^Azx&9*!op$>5I`&zmPT^+cIJ#5u@nn{X*gPDy1Ab?mDSdTF} z{Xfp|^DjsrP&-H`$bO(RSpG9I{0HLC|D71#a>_9X^8I1>^P7QzjSVQqEXeSW;Ufb; z0I~dF{Qmy~+ZzU;{XlI%1DK$}3uLe`{s$WLkKr%NPlg|26Byo$voZYq^@o9zlbzwq zhp!C(m=YKO0*K`|UkJlz)mnxhKYl@+&j{5IbO{qP&@`Y+{=U7#!0_iY!;hbQ48MQ> z0ekh&?|;BRW?=&eAQl!@R>q${{xkge{tx1Os24zi$i(!Yft7`g;l+!m|2J)1|BaKA z6BN9RKuy2^{KNG4@%@_s0mSm<%a8wGzy1Q6{2S~ACMLKaz){M|!p!jc)yv;ox2}i; z3SI(YPNa173Lt=3L_~xbrKN=#zJLD#b^$D5LL9@$z{SPQz{A4@5_$o|4;i3g1#%(K ze+&Qt#Pa&}yZ?9ZK8Cu03F-rgH$bl8;^JZW`t>J>#|hE^(Z~pQ0zd$<$jM1F85!v^ zeEaqT;e8}8aC7r8?AcokqMFU{xLwj!oUC!K#Y=-@@+uc0*HS@5)r}x5Sy8qiS^5uPfy>ydszV#c#57I h0Ro7T((DWnU;v-V`~~Z;XPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOS_ z0{|CRnO*k)00MtWL_t(I%WaZfNRv?*$N$gqedjhe_u&WT!ntaN7bR+15P~7-)LdT{ z-4xwK5O||7!jCQtp_{xk1PO_-8=)IR>Y^MJNlOhR2a#ziHcQ+@VXu2XP8Uww_IA$2 zd3ZR#AAg>62+8FsDul`5hQ`F+p?07X%dlVk32yGyQCS62!~i?M4lx-MX5N&}E4;5^xx4~IArK~WS~t=87Y z#`=KWZid5|3-3{P@n$F}^MCYQYJ$BO0K(xwNT9B+7O5}+sPXq_i-KV13JfP}P|epxR-iN>X9}m3C~&Mr1Joj09+^1{Ub{-FrNI{?zTx^#V)r4h9CsLFvN+ z0hpN%K~|I@&N%=EN^S*!6ki9UKVU*GVQvZ*oc9 zK~!1;Cx9#_v0*1Jzs`gQ2VX*xR=~N0&dz{NUeVG^uG})P|G^GN!FVt@0jsqTCX)&8 zKTPS8%)WZajsGQ{&9o*e7{sLNp{`v97B*y>%002ovPDHLkV1hNCO)CHZ literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/phones.png b/pandora/skins/Default/imgs/phones.png new file mode 100644 index 0000000000000000000000000000000000000000..e072b2b1d825afe66ad1bbbd9c95accb8d523ce4 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)1_2UNAgny&85KD8gCb z5n0T@z%2~Ij105pNB{-dOFVsD*{`s1aqC!xz1y<@DAZHp8d2h$pPQSSSHj?%npdh@ zoLQBcqL7)KpT}hj2V7hl$(jmA1_mYyUWwVINeb#&nYp=%$?6KhC8?QtsYN;pTp1-L z1y=g{5DC59(&EhIjKrKAz2qt`uH>TB#1f#f<(VZJ3MCn-3hti10Xi@(<>lpi>6y6& zdih1^Uq0_D1iI_4r;B4q#jUd!4ZWBHMOq)8PskMvzP0khqlg{Mu4|56;>}n%b!udj z?>8luBj{l+0hw;jir z^)B=t^!w2GnCZd+A+y4kJs+lMiL?p)RCslA;yJ;e+(EnQL{)l^p1A$?^B?o7&ga%{ zyg#p|y6@c=v$Ot^&z5t33;zo**g3JHzIrXonssY$-@G?>mhPc~iuKoDhcU4=@7sNQ z_R2`!V~aPQe6msK!=Eoor#F4d`gVEm3qfa&rS5aqX3Udnu3zf^rq!+E*sO~+K#wwb My85}Sb4q9e0Giju@c;k- literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/r_disabled.png b/pandora/skins/Default/imgs/r_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..702ed6aa4419b717f29346275602b8c2819b82c9 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrev8v_I5hQMesAcwIy$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+w=f7ZGR&GI0Tg5}@$_|Nzs|$ND<#3+ACwFhE)};L{5N&a_jcQz7x?eKGHF>NFXw;x z8v)xq?sVSwY^r5Ce}MPHB;k|K_Ho}~Tr6bx)r$R`*TUld-v?4v>epzcvBfYxzIIvr pUixjzf16L1D1~KPh{itQ_7Cwc`f}r$2r#f1JYD@<);T3K0RYGjlso_c literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/r_enabled.png b/pandora/skins/Default/imgs/r_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..239a856d1d8c8f0ccb5bcc1e0c6a2a4aa4369d58 GIT binary patch literal 462 zcmV;<0WtoGP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFV& z4I2?>NZW=000B-(L_t(I%gs}}YQsPfoIO;CGzKXuT*t<^c6E@XPGNtFL8Nf+9|$g- zFHuMv7Xp6{~9aJ`Zs<4qA=&=boh5HB3;jb`t5v~xfn#LNKz2!qsb zdEQQxifeQM07;TuG}2U_D|BsRFc{nl09Y&*Z(VvOX1)TjDm3Mn8flT)1=Lzw-YN~HN_`fL`1W~URCy}|F>U&Xm*04zXXYB3IOx@d{|>LbGdxK-y;me%Zk-F zVCG=CT)v*GOaOk-TmV3M_f_W^vp*8iyAkvNV2JimM076>kYK(Gbc}x_A|E50W!rW( znM`yPMH@470I&)LPbN>(RP=hiyDZC|4Q3S#F*Uj4IA3ubZ;CfJp19p^Z7JoAQtHKZ z-Ce7g(P;F!Uau1=rEGnAjqkI~r)M^qqlo?ij*nyF8%f)i9kWT;9{>OV07*qoM6N<$ Ef{g*S1ONa4 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/imgs/samba.png b/pandora/skins/Default/imgs/samba.png new file mode 100755 index 0000000000000000000000000000000000000000..f261e77dc74baa672c49a9eea7c73f1df19f0b17 GIT binary patch literal 989 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 ITj9)q0TZdYTL1t6 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/sections/emulators.png b/pandora/skins/Default/sections/emulators.png new file mode 100755 index 0000000000000000000000000000000000000000..3efef515a73fe83e75b8cc34ac156aa8012c90aa GIT binary patch literal 1952 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/sections/settings.png b/pandora/skins/Default/sections/settings.png new file mode 100755 index 0000000000000000000000000000000000000000..f37127ebc12b5c108392ec1835a1af939c3809ca GIT binary patch literal 3316 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 literal 0 HcmV?d00001 diff --git a/pandora/skins/Default/skin.conf b/pandora/skins/Default/skin.conf new file mode 100644 index 0000000..c98f25d --- /dev/null +++ b/pandora/skins/Default/skin.conf @@ -0,0 +1,9 @@ +messageBoxBorder=#505050ff +topBarBg=#ffffff80 +selectionBg=#ffffff80 +messageBoxBg=#00000080 +messageBoxSelection=#fffffff80 +bottomBarBg=#ffffff80 +topBarHeight=50 +linkHeight=50 +linkWidth=80 \ No newline at end of file diff --git a/pandora/skins/Default/wallpapers/pandora-nova-desat.png b/pandora/skins/Default/wallpapers/pandora-nova-desat.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f0f71cd0228db72cfc60b532bfac4ce9f25acb GIT binary patch literal 153566 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

J#I8QKx3{+s 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 literal 0 HcmV?d00001 diff --git a/pandora/translations/Basque b/pandora/translations/Basque new file mode 100644 index 0000000..1895e61 --- /dev/null +++ b/pandora/translations/Basque @@ -0,0 +1,129 @@ +Settings=Aukerak +Configure GMenu2X's options=GMenu2X aukerak konfiguratu +Activate Usb on SD=Sd-aren usb-a aktibatu +Activate Usb on Nand=Nand-aren usb-a aktibatu +Info about GMenu2X=GMenu2X-ri buruzkoak erakutsi +About=Honi buruz... +Add section=Sekzioa gehitu +Rename section=Sekzioaren izena aldatu +Delete section=Sekzioa ezabatu +Scan for applications and games=Jokuak eta programak bilatu +applications=Programak +Edit link=Esteka aldatu +Title=Izenburua +Link title=Estekaren izenburua +Description=Azalpena +Link description=Azalpenaren esteka +Section=sekzioa +The section this link belongs to=Esteka honen sekzioa da +Icon=Ikonoa +Select an icon for the link: $1=Estekarentzako ikonoa aukeratu: $1 +Manual=Eskuliburua +Select a graphic/textual manual or a readme=Aukeratu eskuliburua(testua edo grafikoa) +Cpu clock frequency to set when launching this link=Programa hau abiarazteko PUZ abiadura ezarri +Volume to set for this link=Esteka honentzako bolumena ezarri +Parameters=Parametroak +Parameters to pass to the application=Programara pasatuko diren parametroak +Selector Directory=Selektorearen karpeta +Directory to scan for the selector=Selektorearekin eskaneatuko den direktorioa +Selector Browser=Selektorearen arakatzailea +Allow the selector to change directory=Selektoreari direktorioz aldatzea baimendu +Selector Filter=Selektorearen iragazkia +Filter for the selector (Separate values with a comma)=Selektorearentzako iragazkiak(Balioak komekin banandu) +Selector Screenshots=Selektorearen pantaila-argazkia +Directory of the screenshots for the selector=Selektorearen pantaila-argazkien direktorioa +Selector Aliases=Selektorearen aliasak +File containing a list of aliases for the selector=Aliasen zerrenda duen artxiboaren izena +Don't Leave=Ez irten +Don't quit GMenu2X when launching this link=Lotura hau abiaraztean ez amaitu Gmenu2x +Save last selection=Azken aukera gogoratu +Save the last selected link and section on exit=Azken aukera eta esteka gorde irtetean +Clock for GMenu2X=GMenu2X-ren erlojua +Set the cpu working frequency when running GMenu2X=Gmenu2x-rentzako PUZ abiadura ezarri +Maximum overclock=Overclock muga +Set the maximum overclock for launching links=Ezarri daitekeen overclockik handiena +Global Volume=Bolumen orokorra +Set the default volume for the gp2x soundcard=Aurrezarritako bolumen maila +Output logs=log artxiboak +Logs the output of the links. Use the Log Viewer to read them.=esteken log-ak gorde. Log irakurlea erabili irakurtzeko. +Number of columns=Zutabe zenbakia +Set the number of columns of links to display on a page=Orri bakoitzeko erakutsiko diren zutabeak +Number of rows=Ilara zenbakia +Set the number of rows of links to display on a page=Orri bakoitzeko erakutsiko diren ilarak +Top Bar Color=Goiko barraren kolorea +Color of the top bar=Goian dagoen barraren kolorea +Bottom Bar Color=Beheko barraren kolorea +Color of the bottom bar=Behean dagoen barraren kolorea +Selection Color=aukeratutakoaren kolorea +Color of the selection and other interface details=Aukeratutako testuaren kolorea eta interfacearen beste aukera batzuk +You should disable Usb Networking to do this.=Usb sarea desaktibatu beharko zenuke. +Operation not permitted.=Baimendu gabeko operazioa. +Language=Hizkuntza +Set the language used by GMenu2X=Aukeratu Gmenu2x-ren hizkuntza +Increase=Handitu +Decrease=txikitu +Change color component=Kolore konponentea aldatu +Increase value=Balioa handitu +Decrease value=Balioa txikitu +Switch=Aldatu +Change value=Balioa aldatu +Edit=Editatu +Clear=Garbitu +Select a directory=Direktorioa aukeratu +Select a file=Artxiboa aukeratu ezazu +Clock (default: 200)=Maiztasuna (Aurrezarritakoa: 200) +Volume (default: -1)=bolumena (Aurrezarritakoa: -1) +Enter folder=Karpetan sartu +Confirm=Berretsi +Enter folder/Confirm=karpetan sartu/Berretsi +Up one folder=Karpeta bat gora +Select an application=Programa aukeratu +Space=espazio-barra +Shift=Shift +Cancel=Cancelar +OK=Ok +Backspace=Backspace +Skin=Maskara +Set the skin used by GMenu2X=GMenu2X-ren maskara aukeratu +Add link in $1=esteka sortu... $1 +Edit $1=Aldatu $1 +Delete $1 link=honen esteka ezabatu $1 +Deleting $1=Ezabatzen $1 +Are you sure?=Ziur zaude? +Insert a name for the new section=Sekzio berrirako izena sartu +Insert a new name for this section=Sekzio honetarako izen berria sartu +Yes=Bai +No=Ez +You will lose all the links in this section.=Sekzio honetako esteka guztiak galduko dira +Exit=Irten +Link Scanner=Esteka bilatzailea +Scanning SD filesystem...=SD txartela arakatzen... +Scanning NAND filesystem...=NAND memoria arakatzen... +$1 files found.=$1 aurkitutako artxiboak(s). +Creating links...=Estekak sortzen... +$1 links created.=$1 esteka sorturik(s). +Version $1 (Build date: $2)=Bertsioa $1 (data: $2) +Log Viewer=Log irakurlea +Displays last launched program's output=Abiarazitako azken programa erakutsi +Do you want to delete the log file?=Log-ak ezabatu nahi dituzu? +USB Enabled (SD)=USB-a piztuta (SD) +USB Enabled (Nand)=USB-a piztuta (Nand) +Turn off=Desaktibatu +Launching $1=Abiarazten $1 +Change page=Orria aldatu +Page=Orria +Scroll=scroll +Untitled=Izenburu gabekoa +Change GMenu2X wallpaper=GMenu2X-ren atzeko irudia aldatu +Activate/deactivate tv-out=Tv-out piztu/itzali +Select wallpaper=aukeratu atzekaldeko irudia +Gamma=Gama +Set gp2x gamma value (default: 10)=Gp2x-ren gama balioa ezarri (aurrezarritakoa: 10) +Tv-Out encoding=tv-out-ren kodeketa +Encoding of the tv-out signal=TV-out-ren seinalearen kodeketa +Tweak RAM Timings=Ram denborak hobetu +This usually speeds up the application at the cost of stability=programa azkarrago doa estabilitatearen truke. +Gamma (default: 0)=Gama (aurrezarritakoa: 0) +Gamma value to set when launching this link=Esteka hau abiarazteko erabiltzen den gama balioa +Wrapper=Itzuli +Explicitly relaunch GMenu2X after this link's execution ends=Amaitzerakoan gmenu2x birkargatu diff --git a/pandora/translations/Catalan b/pandora/translations/Catalan new file mode 100644 index 0000000..94a53db --- /dev/null +++ b/pandora/translations/Catalan @@ -0,0 +1,137 @@ +Settings=Preferències +Configure GMenu2X's options=Configura les opcions del GMenu2X +Activate Usb on SD=Activa USB per la SD +Activate Usb on Nand=Activa USB per la Nand +Info about GMenu2X=Informació del GMenu2X +About=Informació +Add section=Afegir secció +Rename section=Re anomenar secció +Delete section=Eliminar secció +Scan for applications and games=Buscar aplicacions i jocs +applications=Aplicacions +Edit link=Editar enllaç +Title=Títol +Link title=Títol de l'enllaç +Description=Descripció +Link description=Descripció de l'enllaç +Section=Secció +The section this link belongs to=Secció a la que pertany l'enllaç +Icon=Icona +Select an icon for the link: $1=Selecciona una icona per l'enllaç: $1 +Manual=Manual +Select a graphic/textual manual or a readme=Selecciona un manual gràfic/text o un "readme" +Cpu clock frequency to set when launching this link=Ajust del rellotge de la cpu per aquest enllaç +Volume to set for this link=Ajust del volum de l'enllaç +Parameters=Paràmetres +Parameters to pass to the application=Paràmetres que s'envien a l'aplicació +Selector Directory=Directori del Selector +Directory to scan for the selector=Directori a explorar amb el selector +Selector Browser=Explorador del selector +Allow the selector to change directory=Permetre al selector canviar de directori +Selector Filter=Filtre del selector +Filter for the selector (Separate values with a comma)=Filtre per el selector (Separar valors amb comes) +Selector Screenshots=Captures de pantalla del selector +Directory of the screenshots for the selector=Directori de captures de pantalla per el selector +Selector Aliases=Alias del selector +File containing a list of aliases for the selector=Fitxer que conté la llista d'alias per el selector +Explicitly relaunch GMenu2X after this link's execution ends=Força recarregar el GMenu2X a l'acabar l'execució de l'enllaç +Don't Leave=No sortir +Don't quit GMenu2X when launching this link=No tancar GMenu2X al carregar aquest enllaç +Save last selection=Recordar l'última selecció +Save the last selected link and section on exit=Recordar l'última secció i enllaç seleccionat al sortir +Clock for GMenu2X=Rellotge per al GMenu2X +Set the cpu working frequency when running GMenu2X=Ajustar la freqüència de treball de la cpu a l'executar GMenu2X +Maximum overclock=Overclock màxim +Set the maximum overclock for launching links=Ajustar al màxim overclock per a carregar enllaços +Global Volume=Volum global +Set the default volume for the gp2x soundcard=Ajusta el volum per defecte del so a la gp2x +Output logs=Fitxers de Log +Logs the output of the links. Use the Log Viewer to read them.=Enregistra els Logs dels enllaços. Usa el lector de registres per llegir-los. +Number of columns=Número de columnes +Set the number of columns of links to display on a page=Ajusta el número de columnes d'enllaços a mostrar per pàgina +Number of rows=Número de línies +Set the number of rows of links to display on a page=Ajusta el número de línies d'enllaços a mostrar per pàgina +Top Bar Color=Color de barra superior +Color of the top bar=Color de la barra superior +Bottom Bar Color=Color de barra inferior +Color of the bottom bar=Color de la barra inferior +Selection Color=Color selecció +Color of the selection and other interface details=Color de la selecció i altres detalls de la interfície +You should disable Usb Networking to do this.=Ha de desactivar la Xarxa per USB per fer això. +Operation not permitted.=Operació no permesa. +Language=Idioma +Set the language used by GMenu2X=Ajusta l'idioma utilitzat al GMenu2X +Increase=Augmentar +Decrease=Reduïr +Change color component=Canviar component cromàtic +Increase value=Incrementar valor +Decrease value=Reduir valor +Switch=Canviar +Change value=Canviar valor +Edit=Modificar +Clear=Netejar +Select a directory=Selecciona un directori +Select a file=Selecciona un fitxer +Clock (default: 200)=Freqüència (predeterminada: 200) +Volume (default: -1)=Volum (predeterminat: -1) +Enter folder=Entrar a la carpeta +Wrapper=Retornar +Confirm=Confirmar +Enter folder/Confirm=Entrar a la carpeta/Confirmar +Up one folder=Pujar una carpeta +Select an application=Selecciona un programa +Space=Espai +Shift=Majúscules +Cancel=Cancel·lar +OK=Acceptar +Backspace=Retrocés +Skin=Tema +Set the skin used by GMenu2X=Selecciona el tema a utilitzar al GMenu2X +Add link in $1=Afegir enllaç a $1 +Edit $1=Modificar $1 +Delete $1 link=Eliminar l'enllaç de $1 +Deleting $1=Eliminant $1 +Are you sure?=Estàs segur? +Insert a name for the new section=Introduir nom per a la nova secció +Insert a new name for this section=Introduir nou nom per a la secció +Yes=Si +No=No +You will lose all the links in this section.=Es perdran tots els enllaços d'aquesta secció. +Exit=Sortir +Link Scanner=Buscador d'enllaços +Scanning SD filesystem...=Explorant el sistema de fitxers de la SD... +Scanning NAND filesystem...=Explorant el sistema de fitxers de la NAND... +$1 files found.=$1 Fitxer(s) trobat(s). +Creating links...=Creant enllaços... +$1 links created.=$1 enllaç(os) creat(s). +Version $1 (Build date: $2)=Versió $1 (Compilació: $2) +Log Viewer=Visor de Logs +Displays last launched program's output=Mostra la sortida de l'últim programa executat +Do you want to delete the log file?=¿Desitja eliminar el fitxer de registre de successos? +USB Enabled (SD)=USB Activat (SD) +USB Enabled (Nand)=USB Activat (Nand) +Turn off=Desactivar +Launching $1=Executant $1 +Change page=Canviar pàgina +Page=Pàgina +Scroll=Desplaçament +Untitled=Sense títol +Change GMenu2X wallpaper=Canvia el fons del GMenu2X +Activate/deactivate tv-out=Activa/desactiva la sortida de TV +Select wallpaper=Selecciona la imatge de fons +Gamma=Gamma +Set gp2x gamma value (default: 10)=Ajustar el valor gama de la gp2x (predeterminat: 10) +Tv-Out encoding=Codificació de sortida de TV +Encoding of the tv-out signal=Codificació de la senyal de sortida de TV +Tweak RAM Timings=Modifica la sincronització de RAM +This usually speeds up the application at the cost of stability=Normalment accelera l'aplicació a costa de l'estabilitat +Gamma (default: 0)=Gamma (predeterminat: 0) +Gamma value to set when launching this link=Valor de gamma que utilitzarà a l'executar aquest enllaç +Wallpaper=Fons d'escriptori +Configure skin=Configura el Tema +Message Box Color=Color de caixa de text +Message Box Border Color=Color de la vora de la caixa de text +Message Box Selection Color=Color de la selecció de la caixa de text +Background color of the message box=Color de fons de la caixa de text +Border color of the message box=Color de la vora de la caixa de text +Color of the selection of the message box=Color de la selecció de la caixa de text diff --git a/pandora/translations/Danish b/pandora/translations/Danish new file mode 100644 index 0000000..ecd2099 --- /dev/null +++ b/pandora/translations/Danish @@ -0,0 +1,129 @@ +settings=Indstillinger +Configure GMenu2X's options=Konfigurer GMenu2X's Indstillinger +Activate Usb on SD=Aktiver Usb pÃ¥ SD +Activate Usb on Nand=Aktiver Usb pÃ¥ Nand +Info about GMenu2X=Information om GMenu2X +Activate/deactivate tv-out=Aktiver/deaktiver tv-udgang +Exit GMenu2X to the official frontend=Lukker GMenu2X +Change GMenu2X wallpaper=Skift baggrund +About=Om +Add section=Tilføj sektion +Rename section=Ændre navn pÃ¥ sektion +Delete section=Slet sektion +Scan for applications and games=Skan hukommelsen for applikationer og spil +applications=applikationer +Edit link=Rediger genveje +Title=Titel +Link title=Genvejs titel +Description=Beskrivelse +Link description=Genvejs beskrivelse +Section=Seektion +The section this link belongs to=Sektionen for denne genvej +Icon=Ikon +Select an icon for the link=Vælg et ikon til denne genvej +Manual=Manual +Select a graphic/textual manual or a readme=Vælg en grafisk/tekstbaseret manual eller en readme fil +Cpu clock frequency to set when launching this link=Cpu-clockfrekvens indstilling for denne genvej +Volume to set for this link=Lydstyrke indstilling for denne genvej +Parameters=Parametre +Parameters to pass to the application=Angiv parametre for applikationen +Selector Directory=Selector oversigt +Directory to scan for the selector=Angiv Mappe som selector skal skanne +Selector Browser=Selector Browser +Allow the selector to change directory=Tillad selector at ændre mappe +Selector Filter=Selector filter +Filter for the selector (Separate values with a comma)=Filter til selector (separer værdier med komma) +Selector Screenshots= Selector Screenshots +Directory of the screenshots for the selector=Mappe med Screenshots af selector +Selector Aliases=Selector alias +File containing a list of aliases for the selector=Fil som indeholder en liste over alias for selector +Explicitly relaunch GMenu2X after this link's execution ends=Tving GMenu2X til at genstarte nÃ¥r denne genvej køres +Don't Leave=Forlad ikke +Don't quit GMenu2X when launching this link=Afslut ikke GMenu2X nÃ¥r denne genvej startes +Save last selection=Gem sidste ændring +Save the last selected link and section on exit= Gem sidst valgte genvej og sektion ved afslutning +Clock for GMenu2X=Clockfrekvens for GMenu2X +Set the cpu working frequency when running GMenu2X=Indstil cpu-clockfrekvens for GMenu2X +Maximum overclock=Maksimal clockfrekvens +Set the maximum overclock for launching links=Indstil maksimal clockfrekvens ved opstart af genvej +Global Volume=Global lydstyrke +Set the default volume for the gp2x soundcard=Indstil standard lydstyrke for gp2x lydkort +Output logs=Vis logs +Logs the output of the links. Use the Log Viewer to read them.=Danner logs for genvejene. Anvend Vis log for at Ã¥bne dem. +Number of columns=Antal spalter +Set the number of columns of links to display on a page=Angiv antallet af spalter for genveje per side +Number of rows=Antal rækker +Set the number of rows of links to display on a page= Angiv antallet af rækker for genveje per side +Top Bar Color=Øverste bjælkes farve +Color of the top bar= Øverste bjælkes farve +Bottom Bar Color=Nederste bjælkes farve +Color of the bottom bar=Nederste bjælkes farve +Selection Color=Markørens farve +Color of the selection and other interface details= Markøren og grænseflades farve +You should disable Usb Networking to do this.=Du bør fravælge USB netværket nÃ¥ du vælger dette +Operation not permitted.=Dette er ikke tilladt. +Language=Sprog +Set the language used by GMenu2X=Indstil sprog der anvendes i GMenu2X +Increase=Op +Decrease=Ned +Change color component=Ændre farven pÃ¥ komponent +Increase value=Op +Decrease value=Ned +Switch=Ændre +Change value=Ændre værdi +Edit=Rediger +Clear=Ryd +Select a directory=Vælg en mappe +Select a file=Vælg en fil +Clock (default: 200)=Clockfrekvens (normal: 200) +Volume (default: -1)=Lydstyrke (normal: -1) +Wrapper=Wrapper +Enter folder=Ã…bn mappe +Confirm=Bekræft +Enter folder/Confirm=Ã…bn mappe/Bekræft +Up one folder=Tilbage +Select an application=Vælg en applikation +Space=Mellemrum +Shift=Skift +Cancel=Afbryd +OK=OK +Backspace=Slet +Skin=Tema +Set the skin used by GMenu2X =Angiv tema for GMenu2X +Add link in $1=Tilføj genvej i $1 +Edit $1=Rediger $1 +Delete $1 link=Slet $1 +Deleting $1=Sletter $1 +Are you sure?=Er du sikker? +Insert a name for the new section=Angiv navn for den nye sektion +Insert a new name for this section=Angiv nyt navn for denne sektion +Yes=Ja +No=Nej +You will lose all the links in this section.=Du vil miste alle genveje i denne sektion. +Exit=Afslut +Link Scanner=Skan genveje +Scanning SD filesystem...=Skanner SD filsystem... +Scanning NAND filesystem...=Skanner NAND filsystem... +$1 files found.=$1 fil(er) fundet. +Creating links...=Opretter genveje... +$1 links created.=$1 genvej(e) oprettet. +Version $1 (Build date: $2)=Version $1 (den: $2) +Log Viewer=Vis log +Displays last launched program's output=Vis log fra sidst kørte program +Do you want to delete the log file?=Vil du slette denne log fil? +USB Enabled (SD)=USB Aktiveret (SD) +USB Enabled (Nand)=USB Aktiveret (Nand) +Turn off=Afbryd +Launching $1=Starter $1 +Change page=Skift side +Page=Side +Scroll=Rulle +Untitled=Ikke navngivet +Wallpaper=Baggrund +Configure skin=Konfigurer tema +Message Box Color=Farve pÃ¥ Konfigurations vinduet +Message Box Border Color= Farve pÃ¥ Konfig vinduets kant +Message Box Selection Color=Konfig vinduets markør farve +Background color of the message box= Konfigurations vinduets baggrundsfarve +Border color of the message box=Farve pÃ¥ Konfigurations vinduets kant +Color of the selection of the message box=Farven pÃ¥ markøren i Konfigurations vinduet diff --git a/pandora/translations/Dutch b/pandora/translations/Dutch new file mode 100644 index 0000000..eaa3062 --- /dev/null +++ b/pandora/translations/Dutch @@ -0,0 +1,118 @@ +Settings=Instellingen +Configure GMenu2X's options=Instellingen van GMenu2X +Activate Usb on SD=Activeer USB op SD +Activate Usb on Nand=Activeer USB op Nand +Info about GMenu2X=Informatie over GMenu2X +About=Over +Add section=Groep toevoegen +Rename section=Groep hernoemen +Delete section=Groep verwijderen +Scan for applications and games=Zoek applicaties en spellen +applications=applicaties +Edit link=Wijzig snelkoppeling +Title=Naam +Link title=Naam van de snelkoppeling +Description=Omschrijving +Link description=Omschrijving van de snelkoppeling +Section=Groep +The section this link belongs to=De groep waartoe deze snelkoppeling behoort +Icon=Pictogram +Select an icon for the link: $1=Selecteer een pictogram voor de snelkoppeling: $1 +Manual=Handleiding +Select a graphic/textual manual or a readme=Selecteer een grafische/tekstuele handleiding of een readme/leesmij +Cpu clock frequency to set when launching this link=Kloksnelheid voor het starten van deze snelkoppeling +Volume to set for this link=Volume-instelling voor deze snelkoppeling +Parameters=Parameters +Parameters to pass to the application=Parameters om door te geven aan de applicatie +Selector Directory=Kiezer map +Directory to scan for the selector=Map met bestanden voor de kiezer +Selector Browser=Kiezer navigatie +Allow the selector to change directory=Wisselen van map mogelijk maken in kiezer +Selector Filter=Kiezer filter +Filter for the selector (Separate values with a comma)=Filter voor de kiezer (komma-gescheiden) +Selector Screenshots=Kiezer schermafdrukken +Directory of the screenshots for the selector=Map met schermafdrukken voor de kiezer +Selector Aliases=Kiezer aliassen +File containing a list of aliases for the selector=Bestand met aliassen voor de kiezer +Explicitly relaunch GMenu2X after this link's execution ends=GMenux2X altijd herstarten na uitvoeren snelkoppeling +Don't Leave=Niet verlaten +Don't quit GMenu2X when launching this link=GMenu2X niet verlaten bij uitvoeren snelkoppeling +Save last selection=Bewaar laatste keuze +Save the last selected link and section on exit=Bewaar de laatst gekozen snelkoppeling en groep +Clock for GMenu2X=Kloksnelheid voor GMenu2X +Set the cpu working frequency when running GMenu2X=Stel de kloksnelheid in voor het draaien van Gmenu2X +Maximum overclock=Maximale overkloksnelheid +Set the maximum overclock for launching links=Stel maximaal toegestane overkloksnelheid in +Global Volume=Hoofdvolume +Set the default volume for the gp2x soundcard=Stel het standaardvolume in voor de gp2x geluidskaart +Output logs=Uitvoer naar logboek +Logs the output of the links. Use the Log Viewer to read them.=Logt de uitvoer van snelkoppelingen. Gebruik de log viewer om de log te lezen. +Number of columns=Aantal kolommen +Set the number of columns of links to display on a page=Stel het aantal getoonde pictogrammen in (horizontaal) +Number of rows=Aantal rijen +Set the number of rows of links to display on a page=Stel het aantal getoonde pictogrammen in (verticaal) +Top Bar Color=Kleur bovenste balk +Color of the top bar=Kleur van de bovenste balk +Bottom Bar Color=Kleur onderste balk +Color of the bottom bar=Kleur van de onderste balk +Selection Color=Kleur selectie +Color of the selection and other interface details=Kleur van de selectie en andere interface details +You should disable Usb Networking to do this.=Zet USB Netwerk uit om dit te gebruiken. +Operation not permitted.=Handeling niet toegestaan. +Language=Taal +Set the language used by GMenu2X=Stel de taal van GMenu2X in +Increase=Verhoog +Decrease=Verlaag +Change color component=Wijzig kleur component +Increase value=Verhoog waarde +Decrease value=Verlaag waarde +Switch=Wissel +Change value=Wijzig waarde +Edit=Bewerk +Clear=Wis +Select a directory=Selecteer een map +Select a file=Selecteer een bestand +Clock (default: 200)=Kloksnelheid (standaard: 200) +Volume (default: -1)=Volume (standaard: -1) +Wrapper=Schil +Enter folder=Open map +Confirm=Bevestig +Enter folder/Confirm=Open map/Bevestig +Up one folder=Map omhoog +Select an application=Selecteer een applicatie +Space=Spatie +Shift=Shift +Cancel=Annuleer +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Kies de skin voor GMenu2X +Add link in $1=Voeg snelkoppeling toe in $1 +Edit $1=Wijzig $1 +Delete $1 link=Verwijder snelkoppeling $1 +Deleting $1=Verwijdert $1 +Are you sure?=Weet u het zeker? +Insert a name for the new section=Geef een naam voor de nieuwe groep +Insert a new name for this section=Geef een nieuwe naam voor deze groep +Yes=Ja +No=Nee +You will lose all the links in this section.=Alle snelkoppelingen in deze groep worden gewist. +Exit=Verlaat +Link Scanner=Snelkoppeling-Scanner +Scanning SD filesystem...=Scant het SD-bestandssysteem... +Scanning NAND filesystem...=Scant het NAND-bestandssysteem... +$1 files found.=$1 bestand(en) gevonden. +Creating links...=Snelkoppelingen aanmaken... +$1 links created.=$1 Snelkoppeling(en) aangemaakt. +Version $1 (Build date: $2)=Versie $1 (Datum build: $2) +Log Viewer=Logbestand lezer +Displays last launched program's output=Toont de uitvoer van het laatst gestarte programma +Do you want to delete the log file?=Wilt u het logbestand verwijderen? +USB Enabled (SD)=USB geactiveerd (SD) +USB Enabled (Nand)=USB geactiveerd (Nand) +Turn off=Zet uit +Launching $1=Start $1 +Change page=Wijzig pagina +Page=Pagina +Scroll=Scroll +Untitled=Naamloos diff --git a/pandora/translations/Finnish b/pandora/translations/Finnish new file mode 100644 index 0000000..c01f595 --- /dev/null +++ b/pandora/translations/Finnish @@ -0,0 +1,117 @@ +Settings=Asetukset +Configure GMenu2X's options=Muuta GMenu2X:n asetuksia +Activate Usb on SD=Aktivoi USB SD-kortille +Activate Usb on Nand=Aktivoi USB NAND-muistille +Info about GMenu2X=Tietoa GMenu2X:st� +About=Tietoa +Add section=Lis�� v�lilehti +Rename section=Nime� v�lilehti uudelleen +Delete section=Poista v�lilehti +Scan for applications and games=Etsi ohjelmia ja pelej� +applications=ohjelmat +Edit link=Muokkaa linkki� +Title=Otsikko +Link title=Linkin otsikko +Description=Kuvaus +Link description=Linkin kuvaus +Section=V�lilehti +The section this link belongs to=V�lilehti johon t�m� linkki kuuluu +Icon=Kuvake +Select an icon for the link: $1=Valitse kuvake linkille: $1 +Manual=Ohjetiedosto +Select a graphic/textual manual or a readme=Valitse graafinen/tekstipohjainen ohjetiedosto +Cpu clock frequency to set when launching this link=CPU kellotaajuus t�m�n linkin k�ynnistyksess� +Volume to set for this link=��nenvoimakkuus t�lle linkille +Parameters=Parametrit +Parameters to pass to the application=Ohjelmalle annettavat parametrit +Selector Directory=Ohjelmanvalitsimen hakemisto +Directory to scan for the selector=Hakemisto joka skannataan ohjelmanvalitsimelle +Selector Browser=Ohjelmanvalitsimen selain +Allow the selector to change directory=Anna ohjelmanvalitsimen vaihtaa hakemistoa +Selector Filter=Ohjelmavalitsimen filtteri +Filter for the selector (Separate values with a comma)=Filtteri ohjelmanvalitsimelle (Eroita arvot pilkulla) +Selector Screenshots=Kuvakaappaukset ohjelmanvalitsimesta +Directory of the screenshots for the selector=Ohjelmanvalitsimen kuvakaappausten hakemisto +Selector Aliases=Ohjelmanvalitsimen peitenimet +File containing a list of aliases for the selector=Tiedosto, joka sis�lt�� listan peitenimist� ohjelmavalitsimelle +Explicitly relaunch GMenu2X after this link's execution ends=K�ynnist� GMenu2X uudelleen kun linkin ajo on suoritettu +Don't Leave=�l� poistu +Don't quit GMenu2X when launching this link=�l� sulje GMenu2X:�� kun linkki k�ynnistet��n +Save last selection=Muista viimeisin valinta +Save the last selected link and section on exit=Muista viimeisin valinta ja v�lilehti poistuttaessa +Clock for GMenu2X=Kellotaajuus GMenu2X:lle +Set the cpu working frequency when running GMenu2X=S��d� CPU kellotaajuutta GMenu2X:lle +Maximum overclock=Ylikellotusrajoitus +Set the maximum overclock for launching links=S��d� suurin mahdollinen ylikellotus k�ynnistett�ess� linkkej� +Global Volume=Yleinen ��nenvoimakkuus +Set the default volume fo the gp2x soundcard=S��d� perus��nenvoimakkuus gp2x:n ��nikortille +Output logs=Tulosteloki +Logs the output of the links. Use the Log Viewer to read them.=Kirjoita linkkien tuloste lokiin. K�yt� lokilukijaa niiden lukemiseen. +Number of columns=Sarakkeiden lukum��r� +Set the number of columns of links to display on a page=Aseta linkkisarakkeiden lukum��r� sivulla +Number of rows=Rivien lukum��r� +Set the number of rows of links to display on a page=Aseta linkkirivien lukum��r� sivulla +Top Bar Color=V�ri yl�palkille +Color of the top bar=Yl�palkin v�ri +Color of the bottom bar=Alapalkin v�ri +Selection Color=Valinnan v�ri +Color of the selection and other interface details=Valinnan ja muiden ykstiyiskohtien v�ri +You should disable Usb Networking to do this.=Usb Networking:in pit�� olla poissa k�yt�st� jotta voit tehd� t�m�n. +Operation not permitted.=Toiminto ei ole sallittu. +Language=Kieli +Set the language used by GMenu2X=Valitse GMenu2X:n k�ytt�m� kieli +Increase=Lis�� +Decrease=V�henn� +Change color component=Vaihda v�rikomponenttia +Increase value=Nosta arvoa +Decrease value=Laske arvoa +Switch=Vaihda +Change value=Vaihda arvoa +Edit=Muokkaa +Clear=Tyhjenn� +Select a directory=Valitse hakemisto +Select a file=Valitse tiedosto +Clock (default: 200)=Kellotaajuus (oletusarvo: 200) +Volume (default: -1)=��nenvoimakkuus (oletusarvo: -1) +Wrapper=Wrapperi +Enter folder=Avaa kansio +Confirm=Vahvista +Enter folder/Confirm=Avaa kansio/Vahvista +Up one folder=Yksi hakemisto yl�sp�in +Select an application=Valitse ohjelma +Space=V�lily�nti +Shift=Vaihto +Cancel=Peruuta +OK=OK +Backspace=Askelpalautin +Skin=Teema +Set the skin used by GMenu2X=Aseta GMenu2X:n k�ytt�m� teema +Add link in $1=Lis�� linkki v�lilehteen $1 +Edit $1=Muokkaa v�lilehte� $1 +Delete $1 link=Poista v�lilehti $1 +Deleting $1=Poistetaan v�lilehte� $1 +Are you sure?=Oletko varma? +Insert a name for the new section=Anna uuden v�lilehden nimi +Insert a new name for this section=Anna uusi nimi t�lle v�lilehdelle +Yes=Kyll� +No=Ei +You will lose all the links in this section.=Menet�t kaikki t�ss� v�lilehdess� olevat linkit. +Exit=Poistu +Link Scanner=Linkkiskanneri +Scanning SD filesystem...=Skannataan SD-tiedostoj�rjestelm��... +Scanning NAND filesystem...=Skannataan NAND-tiedostoj�rjestelm��... +$1 files found.=$1 tiedosto(a) l�ydetty. +Creating links...=Luodaan linkkej�... +$1 links created.=$1 linkki(�) luotu. +Version $1 (Build date: $2)=Versio $1 (K��nt�p�iv�m��r�: $2) +Log Viewer=Lokilukija +Displays last launched program's output=N�ytt�� viimeksi k�ynnistetyn ohjelman tulosteen +Do you want to delete the log file?=Haluatko poistaa logitiedoston? +USB Enabled (SD)=USB Aktivoitu (SD) +USB Enabled (Nand)=USB Aktivoitu (Nand) +Turn off=Sammuta +Launching $1=K�ynnistet��n $1 +Change page=Vaihda sivua +Page=Sivu +Scroll=Vierit� +Untitled=Nime�m�t�n diff --git a/pandora/translations/French b/pandora/translations/French new file mode 100644 index 0000000..f3d6081 --- /dev/null +++ b/pandora/translations/French @@ -0,0 +1,129 @@ +Settings=Configurations +Configure GMenu2X's options=Configurer les options de GMenu2X +Activate Usb on SD=Activer l'Usb sur la SD +Activate Usb on Nand=Activer l'Usb sur la Nand +Info about GMenu2X=Information sur GMenu2X +About=A propos de +Add section=Ajouter une section +Rename section=Renommer une section +Delete section=Supprimer une section +Scan for applications and games=Rechercher des applications et des jeux +applications=applications +Edit link=Editer un lien +Title=Titre +Link title=Titre du lien +Description=Description +Link description=Description du lien +Section=Section +The section this link belongs to=La section à laquelle appartient ce lien +Icon=Icône +Select an icon for the link: $1=Selectionner une icône pour le lien: $1 +Manual=Manuel +Select a graphic/textual manual or a readme=Selectionner un manuel graphique/textuel ou un readme +Cpu clock frequency to set when launching this link=Fréquence d'horloge CPU à définir lorsqu'on lance ce lien +Volume to set for this link=Volume à définir pour ce lien +Parameters=Paramètres +Parameters to pass to the application=Paramètres à donner à l'application +Selector Directory=Répertoire de Selector +Directory to scan for the selector=Répertoire à rechercher pour le selector +Selector Browser=Explorateur de Selector +Allow the selector to change directory=Laisser le Selector de changer le répertoire +Selector Filter=Filtre de Selector +Filter for the selector (Separate values with a comma)=Filtre pour le Selector (Séparer les valeurs avec une virgule) +Selector Screenshots=Les captures d'écran de Selector +Directory of the screenshots for the selector=Répertoire des captures d'écran pour le selector +Selector Aliases=Aliases de Selector +File containing a list of aliases for the selector=Fichier contenant une liste d'aliases pour selector +Explicitly relaunch GMenu2X after this link's execution ends=Relancer explicitement GMenu2X après la fin de l'execution de ce lien +Don't Leave=Ne quitter pas +Don't quit GMenu2X when launching this link=Ne pas quitter GMenu2X lorsqu'on lance ce lien +Save last selection=Sauvegarder la dernière sélection +Save the last selected link and section on exit=Sauvegarder le dernier lien sélectionné et section en sortant +Clock for GMenu2X=Horloge pour GMenu2X +Set the cpu working frequency when running GMenu2X=Définir la féquence de fonctionnement du CPU lorsqu'on utilise GMenu2X +Maximum overclock=Overclock maximum +Set the maximum overclock for launching links=Définir l'overclock maximum pour lancer des liens +Global Volume=Volume global +Set the default volume for the gp2x soundcard=Définir le volume par défaut pour la carte sonore de la GP2x +Output logs=Logs de sortie +Logs the output of the links. Use the Log Viewer to read them.=Loguer la sortie des liens. Utiliser le lecteur de log pour les lire +Number of columns=Nombre de colonnes +Set the number of columns of links to display on a page=Définir le nombre de colonnes de liens à afficher sur une page +Number of rows=Nombres de rangées +Set the number of rows of links to display on a page=Définir le nombre de rangées de liens à afficher sur une page +Top Bar Color=Couleur de la bar supérieur +Color of the top bar=Couleur de la bar supérieur +Bottom Bar Color=Couleur de la bar inférieur +Color of the bottom bar=Couleur de la bar inférieur +Selection Color=Couleur de sélection +Color of the selection and other interface details=Couleur de la sélection et des autres détails de l'interface +You should disable Usb Networking to do this.=Vous devez désactiver le réseau Usb pour faire ceci. +Operation not permitted.=Opération non permise +Language=Langue +Set the language used by GMenu2X=Définir la langue utilisée par GMenu2X +Increase=Augmenter +Decrease=Diminuer +Change color component=Changer la couleur composante +Increase value=Augmenter la valeur +Decrease value=Diminuer la valeur +Switch=Changer +Change value=Changer la valeur +Edit=Editer +Clear=Effacer +Select a directory=Sélectionner un répertoire +Select a file=Sélectionner un fichier +Clock (default: 200)=Fréquence (par défaut: 200) +Volume (default: -1)=Volume (par défaut: -1) +Wrapper=Wrapper +Enter folder=Enter dans le répertoire +Confirm=Confirmer +Enter folder/Confirm=Entrer un répertoire/Confirmer +Up one folder=Remonter d'un répertoire +Select an application=Sélectionner une application +Space=Espace +Shift=Majuscule +Cancel=Annuler +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Définir la skin utilisé par GMenu2X +Add link in $1=Ajouter un lien dans $1 +Edit $1=Editer $1 +Delete $1 link=Effacer le lien $1 +Deleting $1=Effacement de $1 +Are you sure?=Êtes vous sûr? +Insert a name for the new section=Saisir un nom pour cette nouvelle section +Insert a new name for this section=Saisir un nouveau nom pour cette section +Yes=Oui +No=Non +You will lose all the links in this section.=Vous perdrez tous les liens dans cette section. +Exit=Quitter +Link Scanner=Scanneur de lien +Scanning SD filesystem...=Scanne du sytème de fichier de la SD... +Scanning NAND filesystem...=Scanne du sytème de fichier de la NAND... +$1 files found.=$1 fichiers trouvés. +Creating links...=Création de liens... +$1 links created.=$1 liens créés. +Version $1 (Build date: $2)=Version $1 (Date de compilation: $2) +Log Viewer=Visualisateur de log +Displays last launched program's output=Afficher la sortie du dernier programme lancé +Do you want to delete the log file?=Voulez vous effacer le fichier de log? +USB Enabled (SD)=USB Activé (SD) +USB Enabled (Nand)=USB Activé (Nand) +Turn off=Désactiver +Launching $1=Lancement de $1 +Change page=Changer de page +Page=Page +Scroll=Défilement +Untitled=Sans titre +Change GMenu2X wallpaper=Changer l'arrière-plan de GMenu2X +Activate/deactivate tv-out=Activer/desactiver la sortie TV. +Select wallpaper=Sélectionner l'arrière-plan +Gamma=Gamma +Set gp2x gamma value (default: 10)=Définir la valeur de gamma de la gp2x (par défaut: 10) +Tv-Out encoding=Encodage de la sortie TV +Encoding of the tv-out signal=Encodage du signal de la sortie TV +Tweak RAM Timings=Modification des timings de la RAM +This usually speeds up the application at the cost of stability=Ceci accélère, normalement, l'application mais en contre partie de la stabilité +Gamma (default: 0)=Gamma (par défaut: 0) +Gamma value to set when launching this link=Valeur de gamma à définir lors du lancement de ce lien \ No newline at end of file diff --git a/pandora/translations/German b/pandora/translations/German new file mode 100644 index 0000000..c34ba94 --- /dev/null +++ b/pandora/translations/German @@ -0,0 +1,129 @@ +Settings=Einstellungen +Configure GMenu2X's options=Optionen des GMenu2X konfigurieren +Activate Usb on SD=Aktiviert USB für die SD-Karte +Activate Usb on Nand=Aktiviert USB für den Nand-Speicher +Info about GMenu2X=Informationen über GMenu2X +About=Ãœber +Add section=Sektion hinzufügen +Rename section=Sektion umbenennen +Delete section=Sektion löschen +Scan for applications and games= Nach Anwendungen und Spielen scannen +applications=Anwendungen +Edit link=Link bearbeiten +Title=Titel +Link title=Linktitel +Description=Beschreibung +Link description=Beschreibung für diesen Link +Section=Sektion +The section this link belongs to=Zum Link gehörende Sektion +Icon=Icon +Select an icon for the link: $1=Icon für diesen Link wählen: $1 +Manual=Anleitung +Select a graphic/textual manual or a readme=Wähle eine Graphik/Text Anleitung oder Readme +Cpu clock frequency to set when launching this link=CPU-Takt, mit welchem dieser Link gestartet wird +Volume to set for this link=Lautstärke für diesen Link +Parameters=Parameter +Parameters to pass to the application=Parameter, die an die Anwendung übergeben werden +Selector Directory=Selector Verzeichnis +Directory to scan for the selector=Vom Selector zu scannendes Verzeichnis +Selector Browser=Selector Browser +Allow the selector to change directory=Erlaube dem Selector, das Verzeichnis zu wechseln +Selector Filter=Selector Filter +Filter for the selector (Separate values with a comma)=Filter für den Selector (Werte mit Komma trennen) +Selector Screenshots=Selector Screenshots +Directory of the screenshots for the selector=Screenshot-Verzeichnis für den Selector +Selector Aliases=Selector Alternativnamen +File containing a list of aliases for the selector=Datei mit Liste von Alternativnamen für den Selector +Explicitly relaunch GMenu2X after this link's execution ends=GMenu2X nach Beenden der Anwendung umgehend Neustarten +Don't Leave=Nicht verlassen +Don't quit GMenu2X when launching this link=Beim starten dieses Links GMenu2X nicht beenden +Save last selection=Letzte Auswahl speichern +Save the last selected link and section on exit=Speichert den zuletzt gewählten Link und die Sektion beim Beenden +Clock for GMenu2X=Taktfrequenz für GMenu2X +Set the cpu working frequency when running GMenu2X=Stellt den CPU Arbeitstakt für GMenu2X ein +Maximum overclock=Maximale Ãœbertaktung +Set the maximum overclock for launching links=Einstellen der maximalen Taktfrequenz zum Starten von Links +Global Volume=Allgemeine Lautstärke +Set the default volume for the gp2x soundcard=Einstellen der Standardlautstärke des GP2X Soundchips +Output logs=Ausgabeprotokolle +Logs the output of the links. Use the Log Viewer to read them.=Protokolliert Ausgabe der Links. Benutz den Log Viewer zum Lesen. +Number of columns=Anzahl der Spalten +Set the number of columns of links to display on a page=Anzahl der Spalten mit Links, pro Seite +Number of rows=Anzahl der Zeilen +Set the number of rows of links to display on a page=Anzahl der Zeilen mit Links, pro Seite +Top Bar Color=Farbe der Kopfleiste +Color of the top bar= Stellt Farbe und Transparenz der oberen Menüleiste ein +Bottom Bar Color=Farbe der Fußleiste +Color of the bottom bar=Stellt Farbe und Transparenz der unteren Menüleiste ein +Selection Color=Farbe der Auswahl +Color of the selection and other interface details=Farbe der Auswahl-Hervorhebung und anderer Interface-Details +You should disable Usb Networking to do this.=Du solltest USB Networking deaktivieren um dies zu tun. +Operation not permitted.=Operation nicht gestattet. +Language=Sprache +Set the language used by GMenu2X=Einstellen der GMenu2X-Sprache +Increase=Erhöhen +Decrease=Verringern +Change color component=Farbkomponente ändern +Increase value=Wert erhöhen +Decrease value=Wert verringern +Switch=Wechseln +Change value=Wert ändern +Edit=Bearbeiten +Clear=Leeren +Select a directory=Verzeichnis wählen +Select a file=Datei wählen +Clock (default: 200)=Taktfrequenz (Standard: 200) +Volume (default: -1)=Lautstärke (Standard: -1) +Wrapper=Wrapper +Enter folder=Ordner öffnen +Confirm=Bestätigen +Enter folder/Confirm=Ordner öffnen/Bestätigen +Up one folder=Einen Ordner Aufwärts +Select an application=Anwendung wählen +Space=Leer +Shift=Umschalt +Cancel=Abbrechen +OK=OK +Backspace=Rücktaste +Skin=Skin +Set the skin used by GMenu2X=Skin für GMenu2X auswählen +Add link in $1=Link in "$1" hinzufügen +Edit $1="$1" bearbeiten +Delete $1 link=Link "$1" löschen +Deleting $1="$1" wird gelöscht +Are you sure?=Sind Sie sicher? +Insert a name for the new section=Name für die neue Sektion +Insert a new name for this section=Neuer Name für diese Sektion +Yes=Ja +No=Nein +You will lose all the links in this section.=Alle Links in dieser Sektion gehen verloren. +Exit=Beenden +Link Scanner=Links suchen +Scanning SD filesystem...=SD-Karte wird durchsucht... +Scanning NAND filesystem...=NAND-Speicher wird durchsucht... +$1 files found.=$1 Datei(en) gefunden. +Creating links...=Verknüpfungen werden erstellt. +$1 links created.=$1 Verknüpfung(en) erstellt. +Version $1 (Build date: $2)=Version $1 vom $2 +Log Viewer=Log-Viewer +Displays last launched program's output=Zeigt die Ausgabe der zuletzt gestarteten Anwendung an +Do you want to delete the log file?=Möchten Sie diese Log-Datei löschen? +USB Enabled (SD)=USB aktiviert (SD) +USB Enabled (Nand)=USB aktiviert (Nand) +Turn off=Abschalten +Launching $1=$1 wird gestartet +Change page=Seite wechseln +Page=Seite +Scroll=Scrollen +Untitled=Unbenannt +Change GMenu2X wallpaper=Ändert das GMenu2X Hintergrundbild +Activate/deactivate tv-out=Aktiviert/deaktiviert TV-O ut +Select wallpaper=Hintergrundbild wählen +Gamma=Gamma +Set gp2x gamma value (default: 10)=Setzt den GP2X Gamma-Wert (Standard: 10) +Tv-Out encoding=TV-Out Signal +Encoding of the tv-out signal=Einstellen der TV-Out Fernsehnorm +Tweak RAM Timings=Schnellere RAM-Timings +This usually speeds up the application at the cost of stability=Kann Anwendung beschleunigen, auf Kosten der Stabilität +Gamma (default: 0)=Gamma (Standard: 0) +Gamma value to set when launching this link=Bein Starten dieses Links benutzter Gamma-Wert diff --git a/pandora/translations/Italian b/pandora/translations/Italian new file mode 100644 index 0000000..64488f5 --- /dev/null +++ b/pandora/translations/Italian @@ -0,0 +1,142 @@ +Settings=Impostazioni +Configure GMenu2X's options=Configura le opzioni di GMenu2X +Activate Usb on SD=Attiva USB sulla SD +Activate Usb on Nand=Attiva USB sulla Nand +Info about GMenu2X=Informazioni su GMenu2X +About=Informazioni +Add section=Aggiungi sezione +Rename section=Rinomina sezione +Delete section=Elimina sezione +Scan for applications and games=Cerca applicazioni e giochi +applications=applicazioni +Edit link: $1=Modifica collegamento: $1 +Title=Titolo +Link title=Titolo collegamento +Description=Descrizione +Link description=Descrizione collegamento +Section=Sezione +The section this link belongs to=La sezione alla quale appartiene questo collegamento +Icon=Icona +Select an icon for the link: $1=Seleziona un'icona per il collegamento: $1 +Manual=Manuale +Select a graphic/textual manual or a readme=Seleziona un manuale grafico/testuale o un readme +Cpu clock frequency to set when launching this link=Clock della cpu da impostare quando si lancia questo collegamento +Volume to set for this link=Volume da impostare per questo collegamento +Parameters=Parametri +Parameters to pass to the application=Parametri da passare all'applicazione +Selector Directory=Directory del selettore +Directory to scan for the selector=Directory da utilizzare con il selettore +Selector Browser=Browser del selettore +Allow the selector to change directory=Permetti al selettore di cambiare directory +Selector Filter=Filtro del selettore +Filter for the selector (Separate values with a comma)=Filtro per il selettore (Separa i valori con virgola) +Selector Screenshots=Screenshot del selettore +Directory of the screenshots for the selector=Directory contenente gli screenshot per il selettore +Selector Aliases=Alias del selettore +File containing a list of aliases for the selector=File contenente una lista di alias per il selettore +Explicitly relaunch GMenu2X after this link's execution ends=Rilancia esplicitamente GMenu2X dopo l'esecuzione del collegamento +Don't Leave=Non lasciare +Don't quit GMenu2X when launching this link=Non terminare GMenu2X quando viene lanciato questo collegamento +Save last selection=Salva ultima selezione +Save the last selected link and section on exit=Salva l'ultimo collegamento e sezione usati quando si esce +Clock for GMenu2X=Clock per GMenu2X +Set the cpu working frequency when running GMenu2X=Imposta la frequenza di lavoro per GMenu2X +Maximum overclock=Overclock massimo +Set the maximum overclock for launching links=Imposta la frequenza massima per i collegamenti +Global Volume=Volume globale +Set the default volume for the gp2x soundcard=Imposta il volume standard per la gp2x +Output logs=Log dell'output +Logs the output of the links. Use the Log Viewer to read them.=Tiene traccia dell'output dei collegamenti. Usa il Visualizzatore di Log per leggerlo. +Number of columns=Numero di colonne +Set the number of columns of links to display on a page=Imposta il numero di colonne di collegamenti da visualizzare in una pagina +Number of rows=Numero di righe +Set the number of rows of links to display on a page=Imposta il numero di righe di collegamenti da visualizzare in una pagina +Top Bar Color=Colore barra superiore +Color of the top bar=Colore della barra superiore +Bottom Bar Color=Colore barra inferiore +Color of the bottom bar=Colore della barra inferiore +Selection Color=Colore selezione +Color of the selection and other interface details=Colore della selezione e altri dettagli dell'interfaccia +You should disable Usb Networking to do this.=Dovresti disattivare le impostazioni di rete per farlo. +Operation not permitted.=Operazione non consentita. +Language=Lingua +Set the language used by GMenu2X=Imposta la lingua usata da GMenu2X +Increase=Aumenta +Decrease=Riduci +Change color component=Cambia componente cromatico +Increase value=Incrementa valore +Decrease value=Decrementa valore +Switch=Cambia +Change value=Cambia valore +Edit=Modifica +Clear=Svuota +Select a directory=Seleziona una directory +Select a file=Seleziona un file +Clock (default: 200)=Frequenza (predefinito: 200) +Volume (default: -1)=Volume (predefinito: -1) +Wrapper=Involucro +Enter folder=Entra nella cartella +Confirm=Conferma +Enter folder/Confirm=Entra nella cartella/Conferma +Up one folder=Sali di una cartella +Select an application=Seleziona un'applicazione +Space=Spazio +Shift=Maiusc +Cancel=Annulla +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Imposta la skin usata da GMenu2X +Add link in $1=Aggiungi collegamento in $1 +Edit $1=Modifica $1 +Delete $1 link=Elimina il collegamento $1 +Deleting $1=Rimozione di $1 +Are you sure?=Sei sicuro? +Insert a name for the new section=Inserisci un nome per la nuova sezione +Insert a new name for this section=Inserisci un nuovo nome per questa sezione +Yes=Si +No=No +You will lose all the links in this section.=Perderai tutti i collegamenti in questa sezione. +Exit=Esci +Link Scanner=Scanner di collegamenti +Scanning SD filesystem...=Scansione del filesystem della SD... +Scanning NAND filesystem...=Scansione del filesystem della NAND... +$1 files found.=$1 file trovati. +Creating links...=Creazione collegamenti... +$1 links created.=$1 collegamenti creati. +Version $1 (Build date: $2)=Versione $1 (Data compilazione: $2) +Log Viewer=Visualizzatore di log +Displays last launched program's output=Visualizza l'output dell'ultimo programma eseguito +Do you want to delete the log file?=Vuoi eliminare il file di log? +USB Enabled (SD)=USB Attivata (SD) +USB Enabled (Nand)=USB Attivata (Nand) +Turn off=Disattiva +Launching $1=Esecuzione di $1 +Change page=Cambia pagina +Page=Pagina +Scroll=Scorri +Untitled=Senza titolo +Change GMenu2X wallpaper=Cambia lo sfondo di GMenu2X +Activate/deactivate tv-out=Attiva/disattiva tv-out +Select wallpaper=Seleziona sfondo +Gamma=Gamma +Set gp2x gamma value (default: 10)=Imposta il valore gamma della gp2x (predefinito: 10) +Tv-Out encoding=Codifica uscita tv +Encoding of the tv-out signal=Codifica del segnale dell'uscita tv +Tweak RAM Timings=Modifica i timings della RAM +This usually speeds up the application at the cost of stability=Comporta solitamente un miglioramento delle performance al costo di stabilit� +Gamma (default: 0)=Gamma (predefinito: 0) +Gamma value to set when launching this link=Valore di gamma da impostare quando si lancia questo collegamento +Wallpaper=Sfondo +Configure skin=Configura skin +Message Box Color=Colore Finestra Messaggi +Message Box Border Color=Colore Bordo Finestra Messaggi +Message Box Selection Color=Color Selezione Finestra Messaggi +Background color of the message box=Colore di sfondo della finestra dei messaggi +Border color of the message box=Colore del bordo della finestra dei messaggi +Color of the selection of the message box=Colore della selezione della finestra dei messaggi + +Show root=Mostra radice +Show root folder in the file selection dialogs=Mostra la cartella radice nelle finestre di selezione di file +Change keys=Cambia tasti +Launch an application=Esegue un'applicazione \ No newline at end of file diff --git a/pandora/translations/Norwegian b/pandora/translations/Norwegian new file mode 100644 index 0000000..ec61db7 --- /dev/null +++ b/pandora/translations/Norwegian @@ -0,0 +1,118 @@ +Settings=Instillinger +Configure GMenu2X's options=Konfigurer GMenu2X's innstillinger +Activate Usb on SD=Aktiver USB pÃ¥ SD +Activate Usb on Nand=Aktiver USB pÃ¥ Nand +Info about GMenu2X=Info om GMenu2X +About=Om +Add section=Legg til avdeling +Rename section=Gi nytt navn pÃ¥ avdelning +Delete section=Slett avdelning +Scan for applications and games=Skann etter applikasjoner +applications=applikasjoner +Edit link=Rediger link +Title=Tittel +Link title=Linktittel +Description=Beskrivelse +Link description=Linkbeskrivelse +Section=Avdeling +The section this link belongs to=Avdelningen som denne linken tilhører +Icon=Ikon +Select an icon for the link: $1=Velg et ikon til linken: $1 +Manual=Manual +Select a graphic/textual manual or a readme=Velg en grafisk/tekstbasert manual eller en readme +Cpu clock frequency to set when launching this link=CPU-klokk som skal settes nÃ¥r denne linken startes +Volume to set for this link=Volum som skal settes til denne linken +Parameters=Parametrer +Parameters to pass to the application=Parametrer som skal settes til applikasjonen +Selector Directory=Selectormappe +Directory to scan for the selector=Mappe som selector skal skanne +Selector Browser=Selectorutforsker +Allow the selector to change directory=Tillat selector Ã¥ bytte mappe +Selector Filter=Selectorfilter +Filter for the selector (Separate values with a comma)=Filter for selector (separer verdiene med et komma) +Selector Screenshots=Screenshots for Selector +Directory of the screenshots for the selector=Mappe med screenshots til selector +Selector Aliases=Selectoralias +File containing a list of aliases for the selector=Fil som inneholder en liste med alias for selector +Explicitly relaunch GMenu2X after this link's execution ends=Tving GMenu2X i Ã¥ starte nÃ¥r denne linken er ferdigkjørt +Don't Leave=Forlat ikke +Don't quit GMenu2X when launching this link=Ikke avslutt GMenu2X nÃ¥r denne linken kjøres +Save last selection=Husk siste markering +Save the last selected link and section on exit=Husk siste link og avdeling ved avslutning +Clock for GMenu2X=Klokkefrekvens for GMenu2X +Set the cpu working frequency when running GMenu2X=Sett CPU-frekvensen for GMenu2X +Maximum overclock=Maks overklokk +Set the maximum overclock for launching links=Sett maks overklokk for linker +Global Volume=Mastervolum +Set the default volume fo the gp2x soundcard=Sett overall mastervolum +Output logs=Skriv logg +Logs the output of the links. Use the Log Viewer to read them.=Skriver ut logg for linkene. Bruk loggleseren for Ã¥ lese dem. +Number of columns=Antall spalter +Set the number of columns of links to display on a page=Velg antall spalter med linker som skal vises per side +Number of rows=Antall rader +Set the number of rows of links to display on a page=Velg antall rader med linker som skal vises per side +Top Bar Color=Øverste felts farge +Color of the top bar=Farge pÃ¥ det øverste feltet +Bottom Bar Color=Nederste felts farge +Color of the bottom bar=Färge pÃ¥ det nederste feltet +Selection Color=Markørfarge +Color of the selection and other interface details=Farge pÃ¥ markøren og andre deler av grensesnittet +You should disable Usb Networking to do this.=Du bør slÃ¥ av USB-nettverket nÃ¥r du gjør dette. +Operation not permitted.=Utillat operasjon. +Language=SprÃ¥k +Set the language used by GMenu2X=Still inn sprÃ¥k for GMenu2X +Increase=Øk +Decrease=Minsk +Change color component=Endre fargekomponent +Increase value=Øk verdi +Decrease value=Minsk verdi +Switch=Endre +Change value=Endre verdi +Edit=Rediger +Clear=Rens +Select a directory=Velg en mappe +Select a file=Velg en fil +Clock (default: 200)=Klokkefrekvens (standard: 200) +Volume (default: -1)=Volum (standard: -1) +Wrapper=Wrapper +Enter folder=Ã…pne mappe +Confirm=Bekreft +Enter folder/Confirm=Ã…pne mappe/Bekrefte +Up one folder=Opp en mappe +Select an application=Velg en applikasjon +Space=Mellomrom +Shift=Skift +Cancel=Avbryt +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Velg hvilket skin GMenu2X skal bruke +Add link in $1=Lag link i $1 +Edit $1=Rediger $1 +Delete $1 link=Slett $1 +Deleting $1=Sletter $1 +Are you sure?=Er du sikker? +Insert a name for the new section=Sett navn for den nye avdelningen +Insert a new name for this section=Sett navn for denne avdelningen +Yes=Ja +No=Nei +You will lose all the links in this section.=Du vil miste alle linkene i denne avdelingen. +Exit=Avslutt +Link Scanner=Linkskanner +Scanning SD filesystem...=Skanner igjennom minnekortet... +Scanning NAND filesystem...=Skanner igjennom NAND... +$1 files found.=$1 fil(er) funnet. +Creating links...=Lager linker... +$1 links created.=$1 link(er) er lagd. +Version $1 (Build date: $2)=Versjon $1 (Bygd den: $2) +Log Viewer=Loggleser +Displays last launched program's output=Vis utdata fra siste startede program +Do you want to delete the log file?=Vil du slette loggen? +USB Enabled (SD)=USB Aktivert (SD) +USB Enabled (Nand)=USB Aktivert (NAND) +Turn off=SlÃ¥ av +Launching $1=Starter $1 +Change page=Bytt side +Page=Side +Scroll=Rull +Untitled=Uten navn \ No newline at end of file diff --git a/pandora/translations/Portuguese (Portugal) b/pandora/translations/Portuguese (Portugal) new file mode 100644 index 0000000..70c9084 --- /dev/null +++ b/pandora/translations/Portuguese (Portugal) @@ -0,0 +1,118 @@ +Settings= Configurações +Configure GMenu2X's options=Configurar opções do GMenu2X +Activate Usb on SD=Activar USB para SD +Activate Usb on Nand=Activar USB para Nand +Info about GMenu2X=Informação sobre GMenu2X +About=Sobre +Add section=Adicionar Secção +Rename section= Renomear Secção +Delete section= Eliminar Secção +Scan for applications and games=Procurar aplicações e jogos +applications=aplicações +Edit link=Editar Link +Title=Título +Link title=Título do Link +Description=Descrição +Link description=Descrição do Link +Section=Secção +The section this link belongs to=A secção a que pertence este link +Icon=Ãcone +Select an icon for the link: $1=Seleccionar um ícone para o link: $1 +Manual=Manual +Select a graphic/textual manual or a readme=Seleccionar um manual gráfico e/ou de texto +Cpu clock frequency to set when launching this link=Frequência de relógio do CPU ao lançar este link +Volume to set for this link=Ajustar o volume para este link +Parameters=Parâmetros +Parameters to pass to the application=Parâmetros a enviar para a aplicação +Selector Directory=Directório do Selector +Directory to scan for the selector=Directório a explorar com o selector +Selector Browser=Explorador do selector +Allow the selector to change directory=Permitir ao selector que mude de directório +Selector Filter=Filtro do selector +Filter for the selector (Separate values with a comma)=Filtro do selector (Separar valores com virgulas) +Selector Screenshots=Capturas de ecrã do selector +Directory of the screenshots for the selector=Directório das capturas de ecrã do selector +Selector Aliases=Alias do selector +File containing a list of aliases for the selector=Arquivo que contém a lista de alias para o selector +Explicitly relaunch GMenu2X after this link's execution ends=Forçar relançamento do GMenu2x após fim da execução deste link +Don't Leave=Não Sair +Don't quit GMenu2X when launching this link=Não sair do GMenu2X ao lançar este link +Save last selection=Gravar a última selecção +Save the last selected link and section on exit=Recordar link e secção seleccionadas ao sair +Clock for GMenu2X=Relógio no GMenu2X +Set the cpu working frequency when running GMenu2X=Ajustar a frequência do CPU durante a execução do GMenu2X +Maximum overclock=Overclock máximo +Set the maximum overclock for launching links=Ajustar o overclock máximo ao lançar um link +Global Volume=Volume global +Set the default volume fo the gp2x soundcard=Ajustar o volume por defeito da gp2x +Output logs=Logs de Output +Logs the output of the links. Use the Log Viewer to read them.=Regista o output dos links. Usar o Leitor de Logs para consultar. +Number of columns=Número de colunas +Set the number of columns of links to display on a page=Ajustar o número de colunas (de links) por página +Number of rows=Número de filas +Set the number of rows of links to display on a page=Ajustar o número de filas (de links) por página +Top Bar Color=Cor da barra superior +Color of the top bar= Cor da barra superior +Bottom Bar Color= Cor da barra inferior +Color of the bottom bar= Cor da barra inferior +Selection Color=Cor da selecção +Color of the selection and other interface details=Cor da selecção e outros detalhes do interface +You should disable Usb Networking to do this.=Deve desactivar a função Networking por USB para executar este comando. +Operation not permitted.=Operação não permitida. +Language=Idioma +Set the language used by GMenu2X=Ajustar o idioma usado no GMenu2X +Increase=Aumentar +Decrease=Reduzir +Change color component=Alterar componente da cor +Increase value=Aumentar valor +Decrease value=Reduzir Valor +Switch=Mudar +Change value=Mudar Valor +Edit=Editar +Clear=Eliminar +Select a directory=Seleccionar directório +Select a file=Seleccionar ficheiro +Clock (default: 200)=Frequência (predefinido: 200) +Volume (default: -1)=Volume (predefinido: -1) +Wrapper=Invólucro +Enter folder=Entrar na Pasta +Confirm=Confirmar +Enter folder/Confirm=Entrar na Pasta/Confirmar +Up one folder=Subir uma pasta +Select an application=Seleccionar uma aplicação +Space=Espaço +Shift=Shift +Cancel=Cancelar +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Seleccionar a Skin a usar pelo GMenu2X +Add link in $1=Adicionar link em $1 +Edit $1=Modificar $1 +Delete $1 link=Eliminar o link $1 +Deleting $1=Removendo $1 +Are you sure?=Tem a certeza? +Insert a name for the new section=Insira o nome da nova secção +Insert a new name for this section=Insira um novo nome para esta secção +Yes=Sim +No=Não +You will lose all the links in this section.=Perderá todos os links desta secção. +Exit=Sair +Link Scanner=Pesquisador de links +Scanning SD filesystem...=A pesquisar o filesystem do SD... +Scanning NAND filesystem...=A pesquisar o filesystem do NAND... +$1 files found.=$1 ficheiros encontrados. +Creating links...=A criar Links... +$1 links created.=$1 Links criados. +Version $1 (Build date: $2)=Versão $1 (Data de compilação: $2) +Log Viewer=Leitor de Logs +Displays last launched program's output=Mostra o output do último programa executado +Do you want to delete the log file?=Deseja eliminar o ficheiro de log? +USB Enabled (SD)=USB Activado (SD) +USB Enabled (Nand)=USB Activado (Nand) +Turn off=Desligar +Launching $1= A Executar $1 +Change page=Mudar página +Page=Página +Scroll=Scroll +Untitled=Sem título diff --git a/pandora/translations/Russian b/pandora/translations/Russian new file mode 100644 index 0000000..900cab0 --- /dev/null +++ b/pandora/translations/Russian @@ -0,0 +1,132 @@ +Settings=ÐаÑтройки +Configure GMenu2X's options=Изменить наÑтройки GMenu2X +Activate Usb on SD=Ðктивировать SD через USB +Activate Usb on Nand=Ðктивировать NAND через USB +Info about GMenu2X=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ GMenu2X +About=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +Add section=Добавить Ñекцию +Rename section=Переименовать Ñекцию +Delete section=Удалить Ñекцию +Scan for applications and games= ПоиÑк игр и приложений +applications=ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ +Edit link=Изменить ÑÑылку +Title=Заголовок +Link title=Ð˜Ð¼Ñ ÑÑылки +Description=ОпиÑание +Link description=ОпиÑание ÑÑылки +Section=Ð¡ÐµÐºÑ†Ð¸Ñ +The section this link belongs to=СекциÑ, которой принадлежит ÑÑылка +Icon=Иконка +Select an icon for the link: $1=Выберите иконку к ÑÑылке: $1 +Manual=ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ +Select a graphic/textual manual or a readme=Выберите текÑтовую инÑтрукцию +Cpu clock frequency to set when launching this link=ЧаÑтота CPU при запуÑке данной ÑÑылки +Volume to set for this link=ГромкоÑÑ‚ÑŒ уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ñтой ÑÑылки +Parameters=Параметры +Parameters to pass to the application=Параметры Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ приложению +Selector Directory=Папка проводника +Directory to scan for the selector=Папка Ð´Ð»Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð¸ÐºÐ¾Ð¼ +Selector Browser=Выбрать браузером +Allow the selector to change directory=Разрешить проводнику выбирать папку +Selector Filter=Выбрать фильтр +Filter for the selector (Separate values with a comma)=Фильтр Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð¸ÐºÐ° +Selector Screenshots=Обзор Ñкриншотов +Directory of the screenshots for the selector=Папка Ñ Ñкриншотами Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð¸ÐºÐ° +Selector Aliases=Обзор ÑпиÑков Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ +File containing a list of aliases for the selector=Файл, Ñодержащий ÑпиÑок имён-пÑевдонимов +Explicitly relaunch GMenu2X after this link's execution ends=ПерезапуÑк GMenu2X поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑылки +Don't Leave=Ðе покидать +Don't quit GMenu2X when launching this link=Ðе выключать Gmenu2X когда запуÑкаетÑÑ Ñта ÑÑылка +Save last selection=СохранÑÑ‚ÑŒ поÑледней выбор +Save the last selected link and section on exit=Сохранение поÑледней выбранной ÑÑылки и Ñекции при выключение +Clock for GMenu2X=ЧаÑтота CPU Ð´Ð»Ñ Gmenu2X +Set the cpu working frequency when running GMenu2X=УÑтанавливает чаÑтоту CPU пока запущен Gmenu2X +Maximum overclock=МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñтота CPU +Set the maximum overclock for launching links=МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñтота CPU Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка ÑÑылок +Global Volume=ГромкоÑÑ‚ÑŒ +Set the default volume for the gp2x soundcard=УÑтанавливает громкоÑÑ‚ÑŒ Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð¹ карты GP2X +Output logs=Отчёты +Logs the output of the links. Use the Log Viewer to read them.=Создавать отчёты ÑÑылок +Number of columns=КоличеÑтво Ñтолбцов +Set the number of columns of links to display on a page=УÑтановите количеÑтво Ñтолбцов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñтранице +Number of rows=КоличеÑтво колонок +Set the number of rows of links to display on a page=УÑтановите количеÑтво колонок Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñтранице +Top Bar Color=Цвет панели Ñверху +Color of the top bar=Выберите цвет панели Ñверху +Bottom Bar Color=Цвет панели внизу +Color of the bottom bar= Выберите цвет панели внизу +Selection Color=Цвет панели выбора +Color of the selection and other interface details=Выберите цвет панели выбора +You should disable Usb Networking to do this.=Ð’Ñ‹ должны выключить USB Networking чтобы Ñделать Ñто. +Operation not permitted.=ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ разрешена. +Language=Язык +Set the language used by GMenu2X=Выберите Ñзык интерфейÑа +Increase=Прибавить +Decrease=Убавить +Change color component=Изменить компонент цвета +Increase value=Увеличить значение +Decrease value=Уменьшить значение +Switch=Переключить +Change value=Изменить значение +Edit=Изменить +Clear=ОчиÑтить +Select a directory=Выбрать папку +Select a file=Выбрать файл +Clock (default: 200)=ЧаÑтота CPU (Стандарт: 200) +Volume (default: -1)=ГромкоÑÑ‚ÑŒ (Стандарт: -1) +Wrapper=ПерезапуÑк +Enter folder=Открыть папку +Confirm=Подтвердить +Enter folder/Confirm=Выбрать папку/подтвердить +Up one folder=Ðазад на одну папку +Select an application=Выберите приложение +Space=Пробел +Shift=Shift +Cancel=Выход +OK=OK +Backspace=Стереть +Skin=Скин +Set the skin used by GMenu2X=Выберите Ñкин Ð´Ð»Ñ GMenu2X +Add link in $1=Добавить ÑÑылку в $1 +Edit $1=Именить $1 +Delete $1 link=Удалить ÑÑылку $1 +Deleting $1=Удаление $1 +Are you sure?=Ð’Ñ‹ уверены? +Insert a name for the new section=Впишите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñекции +Insert a new name for this section=Впишите новое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñтой Ñекции +Yes=Да +No=Ðет +You will lose all the links in this section.=Ð’Ñ‹ потерÑете вÑе ÑÑылки в Ñтой Ñекции +Exit=Выход +Link Scanner=ПоиÑк ÑÑылок +Scanning SD filesystem...=Сканирование SD... +Scanning NAND filesystem...=Сканирование NAND... +$1 files found.=$1 Файлов найдено. +Creating links...=Создание ÑÑылок... +$1 links created.=$1 ÑÑылок Ñоздано. +Version $1 (Build date: $2)=ВерÑÐ¸Ñ $1 (Дата Ñборки: $2) +Log Viewer=Отчёты +Displays last launched program's output=Отображает поÑледний запущенный отчёт программы +Do you want to delete the log file?=Ð’Ñ‹ хотите удалить Ñтот отчёт? +USB Enabled (SD)=USB включен (SD) +USB Enabled (Nand)=USB включен (Nand) +Turn off=Выключить +Launching $1=ЗапуÑк $1... +Change page=Изменить Ñтраницу +Page=Страница +Scroll=Прокрутка +Untitled=Ðе названный + + +Change GMenu2X wallpaper=Изменить обои Gmenu2X +Activate/deactivate tv-out=Ðктивировать/дезактивировать ТВ-выход +Select wallpaper=Выберите обои +Gamma=Гамма +Set gp2x gamma value (default: 10)=Значение гаммы Ñкрана GP2X (Ñтандарт: 10) +Tv-Out encoding=Ð¢ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° на ТВ +Encoding of the tv-out signal=Шифровка ТВ Ñигнала +Tweak RAM Timings=Изменение параметров RAM +This usually speeds up the application at the cost of stability=Это обычно убыÑÑ‚Ñ€Ñет приложение +Gamma (default: 0)=Гамма (Ñтандарт: 0) +Gamma value to set when launching this link=Значение гаммы при запуÑке Ñтой ÑÑылки + diff --git a/pandora/translations/Slovak b/pandora/translations/Slovak new file mode 100644 index 0000000..15bda3a --- /dev/null +++ b/pandora/translations/Slovak @@ -0,0 +1,137 @@ +Settings=Nastavenia +Configure GMenu2X's options=NastaviÅ¥ voľby pre GMenu2X +Activate Usb on SD=AktivovaÅ¥ USB pre SD kartu +Activate Usb on Nand=AktivovaÅ¥ USB pre pamäť Nand +Info about GMenu2X=Informácie o GMenu2X +About=O programe +Add section=PridaÅ¥ sekciu +Rename section=PremenovaÅ¥ sekciu +Delete section=VymazaÅ¥ sekciu +Scan for applications and games= HľadaÅ¥ aplikácie a hry +applications=aplikácie +Edit link=UpraviÅ¥ odkaz +Title=Názov +Link title=Názov odkazu +Description=Popis +Link description=Popis pre odkaz +Section=Sekcia +The section this link belongs to=Sekcia, do ktorej patrí tento odkaz +Icon=Ikona +Select an icon for the link=Vyberte ikonu pre tento odkaz +Manual=Návod +Select a graphic/textual manual or a readme=Vyberte grafický/textový návod alebo readme +Cpu clock frequency to set when launching this link=Taktovacia frekvencia procesora, s ktorou bude spustený odkaz +Volume to set for this link=Nastavenie hlasitosti pre tento odkaz +Parameters=Parametre +Parameters to pass to the application=Parametre, ktoré majú byÅ¥ predané aplikácii +Selector Directory=Adresár selektora +Directory to scan for the selector=Adresár, v ktorom má byÅ¥ hľadaný selektor +Selector Browser=PrehliadaÄ selektora +Allow the selector to change directory=Povolí selektorovi zmeniÅ¥ adresár +Selector Filter=Filter pre selektor +Filter for the selector (Separate values with a comma)=Filter pre selektor (hodnoty oddeľujte Äiarkou) +Selector Screenshots=Snímky obrazovky selektora +Directory of the screenshots for the selector=Adresár so snímkami obrazovky selektora +Selector Aliases=Aliasy selektora +File containing a list of aliases for the selector=Súbor obsahujúci zoznam aliasov pre selektor +Explicitly relaunch GMenu2X after this link's execution ends=Explicitne opätovne spustiÅ¥ GMenu2X po ukonÄení spustenia tohto odkazu +Don't Leave=NeopúšťaÅ¥ +Don't quit GMenu2X when launching this link=NeukonÄovaÅ¥ GMenu2X pri spúšťaní tohto odkazu +Save last selection=Ulož posledný výber +Save the last selected link and section on exit=Ulož naposledy vybraný odkaz a sekciu pri ukonÄení +Clock for GMenu2X=Takt. frekvencia pre GMenu2X +Set the cpu working frequency when running GMenu2X=Nastavte frekvenciu cpu poÄas behu GMenu2X +Maximum overclock=Maximálne pretaktovanie +Set the maximum overclock for launching links=Nastavte maximálne pretaktovanie pre spúšťanie odkazov +Global Volume=Globálna hlasitosÅ¥ +Set the default volume for the gp2x soundcard=Nastavte východziu hlasitosÅ¥ pre zvukovú kartu gp2x +Output logs=Výstupné logy +Logs the output of the links. Use the Log Viewer to read them.=Loguje výstup odkazov. Na prezretie použite Log Viewer. +Number of columns=PoÄet stĺpcov +Set the number of columns of links to display on a page=Nastavte poÄet stĺpcov pre odkazy zobrazené na stránke +Number of rows=PoÄet riadkov +Set the number of rows of links to display on a page=PoÄet riadkov odkazov zobrazených na stránke +Top Bar Color=Farba hornej liÅ¡ty +Color of the top bar= Farba hornej liÅ¡ty +Bottom Bar Color=Farba spodnej liÅ¡ty +Color of the bottom bar=Farba spodnej liÅ¡ty +Selection Color=Farba výberu +Color of the selection and other interface details=Farba výberu a iných detailov interfacu +You should disable Usb Networking to do this.=Pre vykonanie tejto operácie by ste mali deaktivovaÅ¥ Usb sieÅ¥ovanie. +Operation not permitted.=Operácia nepovolená. +Language=Jazyk +Set the language used by GMenu2X=Nastavte jazyk pre GMenu2X +Increase=ZvýšiÅ¥ +Decrease=ZnížiÅ¥ +Change color component=ZmeniÅ¥ farebnú zložku +Increase value=ZvýšiÅ¥ hodnotu +Decrease value=ZnížiÅ¥ hodnotu +Switch=Prepnúť +Change value=ZmeniÅ¥ hodnotu +Edit=UpraviÅ¥ +Clear=VyÄistiÅ¥ +Select a directory=Vyberte adresár +Select a file=Vyberte súbor +Clock (default: 200)=Takt (Å¡tandardne: 200) +Volume (default: -1)=HlasitosÅ¥ (Å¡tandardne: -1) +Wrapper=ObaľovaÄ +Enter folder=Zadajte prieÄinok +Confirm=PotvrdiÅ¥ +Enter folder/Confirm=Zadajte prieÄinok/PotvrdiÅ¥ +Up one folder=O jeden prieÄinok vyÅ¡Å¡ie +Select an application=Vyberte aplikáciu +Space=Medzera +Shift=Shift +Cancel=ZruÅ¡iÅ¥ +OK=OK +Backspace=Backspace +Skin=Skin +Set the skin used by GMenu2X=Nastavte skin pre GMenu2X +Add link in $1=PridaÅ¥ odkaz do $1 +Edit $1=UpraviÅ¥ $1 +Delete $1 link=VymazaÅ¥ odkaz na $1 +Deleting $1=Mažem $1 +Are you sure?=Ste si istý? +Insert a name for the new section=Zadajte názov novej sekcie +Insert a new name for this section=Zadajte nový názov pre túto sekciu +Yes=Ãno +No=Nie +You will lose all the links in this section.=Stratíte vÅ¡etky odkazy v tejto sekcii. +Exit=UkonÄiÅ¥ +Link Scanner=VyhľadávaÄ odkazov +Scanning SD filesystem...=Prehľadávam súborový systém na SD karte... +Scanning NAND filesystem...=Prehľadávam súborový systém na pamäti NAND... +$1 files found.=$1 súbor(ov) nájdených. +Creating links...=Vytváram odkazy... +$1 links created.=$1 odkazov vytvorených. +Version $1 (Build date: $2)=Verzia $1 (dátum zostavenia: $2) +Log Viewer=PrehliadaÄ log súborov +Displays last launched program's output=Zobrazuje výstup naposledy spusteného súboru +Do you want to delete the log file?=Želáte si vymazaÅ¥ log súbor? +USB Enabled (SD)=USB aktivované (SD) +USB Enabled (Nand)=USB aktivované (Nand) +Turn off=Vypnúť +Launching $1=Spúšťam $1 +Change page=ZmeniÅ¥ stránku +Page=Stránka +Scroll=SkrolovaÅ¥ +Untitled=Bez mena +Change GMenu2X wallpaper=ZmeniÅ¥ pozadie GMenu2X +Activate/deactivate tv-out=AktivovaÅ¥/deaktivovaÅ¥ výstup na TV +Select wallpaper=Vyberte pozadie +Gamma=Gamma +Set gp2x gamma value (default: 10)=Nastavte hodnotu gamma (implic: 10) +Tv-Out encoding=Kódovanie výstupu na TV +Encoding of the tv-out signal=Kódovanie televízneho signálu +Tweak RAM Timings=UpraviÅ¥ Äasovanie RAM +This usually speeds up the application at the cost of stability=Toto nastavenie zvyÄajne zrýchli aplikáciu na úkor stability +Gamma (default: 0)=Gamma (implic: 0) +Gamma value to set when launching this link=Hodnota gamma pri spúšťaní tohto odkazu +Wallpaper=Pozadie +Configure skin=NastaviÅ¥ skin +Message Box Color=Farba textového okna +Message Box Border Color=Farba okraja textového okna +Message Box Selection Color=Farba výberu textového okna +Background color of the message box=Farba pozadia textového okna +Border color of the message box=Farba okraja textového okna +Color of the selection of the message box=Farba výberu textového okna diff --git a/pandora/translations/Spanish b/pandora/translations/Spanish new file mode 100644 index 0000000..74f5a8e --- /dev/null +++ b/pandora/translations/Spanish @@ -0,0 +1,129 @@ +Settings=Ajustes +Configure GMenu2X's options=Configura las opciones de GMenu2X +Activate Usb on SD=Activa USB para SD +Activate Usb on Nand=Activa USB para Nand +Info about GMenu2X=Información sobre GMenu2X +About=Información +Add section=Añadir sección +Rename section=Renombrar sección +Delete section=Eliminar sección +Scan for applications and games=Buscar aplicaciones y juegos +applications=aplicaciones +Edit link=Editar enlace +Title=Título +Link title=Título de enlace +Description=Descripción +Link description=Descripción de enlace +Section=Sección +The section this link belongs to=La sección a la que pertenece el enlace +Icon=Icono +Select an icon for the link: $1=Seleccione un icono para el enlace: $1 +Manual=Manual +Select a graphic/textual manual or a readme=Seleccione un manual gráfico/texto o un leeme +Cpu clock frequency to set when launching this link=Ajuste del reloj de la cpu para cargar este enlace +Volume to set for this link=Ajuste del volumen para este enlace +Parameters=Parámetros +Parameters to pass to the application=Parámetros que enviar a la aplicación +Selector Directory=Directorio del Selector +Directory to scan for the selector=Directorio que explorar con el selector +Selector Browser=Explorador del selector +Allow the selector to change directory=Permitir al selector cambiar de directorio +Selector Filter=Filtro del selector +Filter for the selector (Separate values with a comma)=Filtro para el selector (Separar valores con comas) +Selector Screenshots=Capturas de pantalla del selector +Directory of the screenshots for the selector=Directorio de capturas de pantalla para el selector +Selector Aliases=Alias del selector +File containing a list of aliases for the selector=Archivo contenedor de la lista de alias para el selector +Don't Leave=No salir +Don't quit GMenu2X when launching this link=No terminar GMenu2X al cargar este enlace +Save last selection=Recordar última selección +Save the last selected link and section on exit=Recordar última sección y enlace seleccionado al salir +Clock for GMenu2X=Reloj para GMenu2X +Set the cpu working frequency when running GMenu2X=Ajuste la frecuencia de trabajo de cpu al ejecutar GMenu2X +Maximum overclock=Overclock máximo +Set the maximum overclock for launching links=Ajuste el máximo overclock para cargar enlaces +Global Volume=Volumen global +Set the default volume for the gp2x soundcard=Ajuste el volumen por defecto del sonido en gp2x +Output logs=Archivos de registro de sucesos +Logs the output of the links. Use the Log Viewer to read them.=Registra los sucesos de los enlaces. Usa el lector de registros para leerlos. +Number of columns=Número de columnas +Set the number of columns of links to display on a page=Ajuste el número de columnas de enlaces que mostrar por página +Number of rows=Número de líneas +Set the number of rows of links to display on a page=Ajuste el número de líneas de enlaces que mostrar por página +Top Bar Color=Color de barra superior +Color of the top bar=Color de la barra superior +Bottom Bar Color=Color de barra inferior +Color of the bottom bar=Color de la barra inferior +Selection Color=Color de selección +Color of the selection and other interface details=Color de la selección y otros detalles del interfaz +You should disable Usb Networking to do this.=Debe desactivar Red por USB para hacer esto. +Operation not permitted.=Operación no permitida. +Language=Idioma +Set the language used by GMenu2X=Ajuste el idioma usado en GMenu2X +Increase=Aumentar +Decrease=Reducir +Change color component=Cambiar componente cromático +Increase value=Incrementar valor +Decrease value=Reducir valor +Switch=Cambiar +Change value=Cambiar valor +Edit=Modificar +Clear=Limpiar +Select a directory=Selecciona un directorio +Select a file=Selecciona un archivo +Clock (default: 200)=Frecuencia (predefinida: 200) +Volume (default: -1)=Volumen (predefinida: -1) +Enter folder=Entrar en carpeta +Confirm=Confirmar +Enter folder/Confirm=Entrar en carpeta/Confirmar +Up one folder=Subir una carpeta +Select an application=Seleccionar un programa +Space=Espacio +Shift=Mayúsculas +Cancel=Cancelar +OK=Aceptar +Backspace=Retroceso +Skin=Máscara +Set the skin used by GMenu2X=Seleccione la máscara usada en GMenu2X +Add link in $1=Añadir enlace en $1 +Edit $1=Modificar $1 +Delete $1 link=Eliminar el enlace de $1 +Deleting $1=Eliminando $1 +Are you sure?=¿Estás seguro? +Insert a name for the new section=Insertar nombre para la nueva sección +Insert a new name for this section=Insertar nuevo nombre para la sección +Yes=Si +No=No +You will lose all the links in this section.=Se perderán todos los enlaces de esta sección. +Exit=Salir +Link Scanner=Buscador de enlaces +Scanning SD filesystem...=Explorando sistema de archivos de SD... +Scanning NAND filesystem...=Explorando sistema de archivos de NAND... +$1 files found.=$1 archivo(s) encontrado(s). +Creating links...=Creando enlaces... +$1 links created.=$1 enlace(s) creado(s). +Version $1 (Build date: $2)=Versión $1 (Compilación: $2) +Log Viewer=Lector de Registro de Sucesos +Displays last launched program's output=Muestra la salida del último programa ejecutado +Do you want to delete the log file?=¿Desea eliminar el archivo de registro de sucesos? +USB Enabled (SD)=USB Activado (SD) +USB Enabled (Nand)=USB Activado (Nand) +Turn off=Desactivar +Launching $1=Ejecutando $1 +Change page=Cambiar página +Page=Página +Scroll=Desplazamiento +Untitled=Sin titulo +Change GMenu2X wallpaper=Cambia el fondo de GMenu2X +Activate/deactivate tv-out=Activa/desactiva salida de tv +Select wallpaper=Selecciona imagen de fondo +Gamma=Gama +Set gp2x gamma value (default: 10)=Ajusta el valor gama de la gp2x (predefinido: 10) +Tv-Out encoding=Codificación de salida de tv +Encoding of the tv-out signal=Codificación de la señal de salida de tv +Tweak RAM Timings=Modifica la sincronización de RAM +This usually speeds up the application at the cost of stability=Normalmente acelera la aplicación a costa de la estabilidad +Gamma (default: 0)=Gama (predefinido: 0) +Gamma value to set when launching this link=Valor de gama que usar al lanzar este enlace +Wrapper=Retornar +Explicitly relaunch GMenu2X after this link's execution ends=Forzar recarga de GMenu2X al terminar ejecución del enlace diff --git a/pandora/translations/Swedish b/pandora/translations/Swedish new file mode 100644 index 0000000..5501464 --- /dev/null +++ b/pandora/translations/Swedish @@ -0,0 +1,119 @@ +Settings=Inställningar +Configure GMenu2X's options=Konfigurera GMenu2X's inställningar +Activate Usb on SD=Aktivera Usb pÃ¥ SD +Activate Usb on Nand=Aktivera Usb pÃ¥ Nand +Info about GMenu2X=Info om GMenu2X +About=Om +Add section=Lägg till avdelning +Rename section=Byt namn pÃ¥ avdelning +Delete section=Ta bort avdelning +Scan for applications and games=Scanna efter applikationer +applications=applikationer +Edit link=Redigera länk +Title=Titel +Link title=Länktitel +Description=Beskrivning +Link description=Länkbeskrivning +Section=Avdelning +The section this link belongs to=Avdelningen som den här länken tillhör +Icon=Ikon +Select an icon for the link: $1=Välj en ikon till länken: $1 +Manual=Manual +Select a graphic/textual manual or a readme=Välj en grafisk/textbaserad manual eller en readme +Cpu clock frequency to set when launching this link=Cpu-klockfrekvens att ändra till när denna länk körs +Volume to set for this link=Volymen som skall sättas för den här länken +Parameters=Parametrar +Parameters to pass to the application=Parametrar som skall skickas till applikationen +Selector Directory=Selectorkatalog +Directory to scan for the selector=Katalog som selector skall scanna +Selector Browser=Selectorutforskare +Allow the selector to change directory=TillÃ¥t selector att byta katalog +Selector Filter=Selectorfilter +Filter for the selector (Separate values with a comma)=Filter för selector (separera värdena med kommatecken) +Selector Screenshots=Skärmdumpar till Selector +Directory of the screenshots for the selector=Katalog med skärmdumpar till selector +Selector Aliases=Selectoralias +File containing a list of aliases for the selector=Fil som innehÃ¥ller en lista med alias för selector +Explicitly relaunch GMenu2X after this link's execution ends=Tvinga GMenu2X att starta om när denna länk körts klart +Don't Leave=Lämna inte +Don't quit GMenu2X when launching this link=Avsluta inte GMenu2X när denna länk körs +Save last selection=Spara senaste markeringen +Save the last selected link and section on exit=Spara senaste länk och avdelning vid avslut +Clock for GMenu2X=Klockfrekvens för GMenu2X +Set the cpu working frequency when running GMenu2X=Ställ in cpu-klockfrekvensen för GMenu2X +Maximum overclock=Maximal överklockning +Set the maximum overclock for launching links=Sätt maximal överklockning vid start av länk +Global Volume=Global volym +Set the default volume fo the gp2x soundcard=Sätt förinställd volym pÃ¥ gp2x ljudkortet +Output logs=logg utskrift +Logs the output of the links. Use the Log Viewer to read them.=Skriver ut loggar för länkarna. Använd loggläsaren för att läsa dem. +Number of columns=Antal spalter +Set the number of columns of links to display on a page=Välj antal spalter med länkar som skall visas per sida +Number of rows=Antal rader +Set the number of rows of links to display on a page=Välj antal rader med länkar som skall visas per sida +Top Bar Color=Översta fältets färg +Color of the top bar=Färg pÃ¥ det översta fältet +Bottom Bar Color=Nedersta fältets färg +Color of the bottom bar=Färg pÃ¥ det nedersta fältet +Selection Color=Markörfärg +Color of the selection and other interface details=Färg pÃ¥ markören och andra delar av gränssnittet +You should disable Usb Networking to do this.=Du bör slÃ¥ av usb-nätverket när du gör detta. +Operation not permitted.=OtillÃ¥ten användning. +Language=SprÃ¥k +Set the language used by GMenu2X=Ställ in sprÃ¥k för GMenu2X +Increase=Öka +Decrease=Minska +Change color component=Ändra färg komponent +Increase value=Öka värde +Decrease value=Minska värde +Switch=Ändra +Change value=Ändra värde +Edit=Redigera +Clear=Rensa +Select a directory=Välj en katalog +Select a file=Välj en fil +Clock (default: 200)=Klockfrekvens (förinställd: 200) +Volume (default: -1)=Volym (förinställd: -1) +Wrapper=Wrapper +Enter folder=Öppna katalog +Confirm=Bekräfta +Enter folder/Confirm=Öppna katalog/Bekräfta +Up one folder=Upp en katalog +Select an application=Välj en applikation +Space=Mellanslag +Shift=Skift +Cancel=Avbryt +OK=OK +Backspace=Backsteg +Skin=Skin +Set the skin used by GMenu2X=Välj vilket skin GMenu2X ska använda +Add link in $1=Skapa länk i $1 +Edit $1=Redigera $1 +Delete $1 link=Ta bort $1 +Deleting $1=Tar bort $1 +Are you sure?=Är du säker? +Insert a name for the new section=Skriv in namn för den nya avdelningen +Insert a new name for this section=Skriv in namn för den här avdelningen +Yes=Ja +No=Nej +You will lose all the links in this section.=Du kommer att förlora alla länkar i den här +avdelningen. +Exit=Avsluta +Link Scanner=Länkscanner +Scanning SD filesystem...=Scannar SD filsystem... +Scanning NAND filesystem...=Scannar NAND filsystem... +$1 files found.=$1 fil(er) funna. +Creating links...=Skapar länkar... +$1 links created.=$1 länk(ar) skapade. +Version $1 (Build date: $2)=Version $1 (Skapad den: $2) +Log Viewer=Logg läsare +Displays last launched program's output=Visa utdata frÃ¥n senast körda program +Do you want to delete the log file?=Vill du ta bort logg filen? +USB Enabled (SD)=USB Aktiverad (SD) +USB Enabled (Nand)=USB Aktiverad (Nand) +Turn off=Stäng av +Launching $1=Startar $1 +Change page=Byt sida +Page=Sida +Scroll=Rulla +Untitled=Obetitlad diff --git a/pandora/translations/Turkish b/pandora/translations/Turkish new file mode 100644 index 0000000..7554ced --- /dev/null +++ b/pandora/translations/Turkish @@ -0,0 +1,133 @@ +Settings=Ayarlar +Configure GMenu2X's options=GMenu2X'in ayarlarini degistir +Activate Usb on SD=SD Karti için USB baglantisini aktive et +Activate Usb on Nand=Nand Bellegi için USB baglantisini aktive et +Info about GMenu2X=GMenu2X hakkinda bilgi +About=Hakkinda +Add section=Bölüm ekle +Rename section=Bölümü yeniden adlandir +Delete section=Bölümü sil +Scan for applications and games=Oyun ve program taramasi +applications=programlar +Edit link=Link'i düzenle +Title=Baslik +Link title=Link basligi +Description=Açiklama +Link description=Link açiklamasi +Section=Bölüm +The section this link belongs to=Bu linkin ait oldugu bölüm +Icon=Icon +Select an icon for the link: $1=$1 Linki için bir simge seçin: +Manual=Kullanim kilavuzu +Select a graphic/textual manual or a readme=Grafik/Text bir kullanim kilavuzu veya readme dosyasi seçin +Cpu clock frequency to set when launching this link=Bu linki baslatirken kullanilacak CPU hizi +Volume to set for this link=Bu linkin ses seviyesi +Parameters=Parametreler +Parameters to pass to the application=Programa baslatirken aktarilacak parametreler +Selector Directory=Seçim klasörü +Directory to scan for the selector=Seçim için taranacak klasör +Selector Browser=Dosya seçimi +Allow the selector to change directory=Dosyas seçiminin klasör degistirmesine izin ver +Selector Filter=Seçim filtresi +Filter for the selector (Separate values with a comma)=Seçim için filtre (Verileri virgül ile ayirin) +Selector Screenshots=Seçim Ekran görüntüleri +Directory of the screenshots for the selector=Seçim için ekran görüntülerinin klasörü +Selector Aliases=Seçim için alternatif isimler (alias) +File containing a list of aliases for the selector=Seçim için alternatif isimleri içeren dosya adi +Explicitly relaunch GMenu2X after this link's execution ends=GMenu2X'i bu linkin çalismasi bittiginde özellikle tekrar baslat +Don't Leave=Çikma +Don't quit GMenu2X when launching this link=Bu linki baslatirken GMenu2X'i durdurma +Save last selection=Son seçimi sakla +Save the last selected link and section on exit=Son seçilen link ve seçimi çikista sakla +Clock for GMenu2X=GMenu2X için CPU hizi +Set the cpu working frequency when running GMenu2X=GMenu2X'in çalistigi CPU hizi +Maximum overclock=Maksimum overclock hizi +Set the maximum overclock for launching links=Linkler baslatilirken kullanilacak en yüksek CPU hizini belirleyin +Global Volume=Genel ses seviyesi +Set the default volume for the gp2x soundcard=GP2X ses kartinin standart ses seviyesini belirleyin +Output logs=Çikti kayitlari +Logs the output of the links. Use the Log Viewer to read them.=Linklerin çiktilarini kaydeder. Kayit gösterici ile okuyabilirsiniz. +Number of columns=Sütun sayisi +Set the number of columns of links to display on a page=Bir sayfada gösterilecek sütun sayisini belirleyin +Number of rows=Satir sayisi +Set the number of rows of links to display on a page=Bir sayfada gösterilecek satir sayisini belirleyin +Top Bar Color=Baslik çubugunun rengi +Color of the top bar=Baslik çubugunun rengini ve saydamligini belirler +Bottom Bar Color=Statü çubugunun rengi +Color of the bottom bar=Statü çubugunun rengini ve saydamligini belirler +Selection Color=Seçim rengi +Color of the selection and other interface details=Seçim rengi ve baska arabirim detaylarinin rengi +You should disable Usb Networking to do this.=Bunu yapmadan önce USB-Ag destegini kapatmalisiniz. +Operation not permitted.=Isleme izin verilmedi. +Language=Dil +Set the language used by GMenu2X=GMenu2X'in kullanacagi dili seçin +Increase=Artir +Decrease=Azalt +Change color component=Renk ögesini degistirin +Increase value=Degeri artir +Decrease value=Degeri azalt +Switch=Degistir +Change value=Degeri degistir +Edit=Düzenle +Clear=Temizle +Select a directory=Bir klasör seç +Select a file=Bir dosya seç +Clock (default: 200)=Hiz (Standart: 200) +Volume (default: -1)=Ses seviyesi (Standart: -1) +Wrapper=GMenu2X'i Tekrar baslat +Enter folder=Klasöre gir +Confirm=Onayla +Enter folder/Confirm=Klasöre gir / Onayla +Up one folder=Bir klasör yukari +Select an application=Bir program seçin +Space=Bosluk +Shift=Shift +Cancel=Vazgeç +OK=OK +Backspace=Geri +Skin=Skin +Set the skin used by GMenu2X=GMenu2X'in kullanacagi Skin'i seçin +Add link in $1=$1 bölümüne link ekle +Edit $1=$1 linkini düzenle +Delete $1 link=$1 linkini sil +Deleting $1=$1 linki silinecek +Are you sure?=Emin misiniz? +Insert a name for the new section=Yeni bölüm için bir isim girin +Insert a new name for this section=Bu bölüm için yeni isim girin +Yes=Evet +No=Hayir +You will lose all the links in this section.=Bu bölümdeki tüm linkleri kaybedeceksiniz. +Exit=Çikis +Link Scanner=Link taramasi +Scanning SD filesystem...=SD karti taraniyor... +Scanning NAND filesystem...=NAND bellegi taraniyor... +$1 files found.=$1 dosya bulundu. +Creating links...=Linkler yaratiliyor. +$1 links created.=$1 link yaratildi. +Version $1 (Build date: $2)=Version $1 - Derleme: $2 +Log Viewer=Kayit Gösterici +Displays last launched program's output=Son çalistirilan programin çiktisini gösterir +Do you want to delete the log file?=Kayit dosyasini silmek istiyor musunuz? +USB Enabled (SD)=USB aktive edildi (SD) +USB Enabled (Nand)=USB aktive edildi (Nand) +Turn off=Kapat +Launching $1=$1 baslatiliyor +Change page=Sayfa degistir +Page=Sayfa +Scroll=Kaydir +Untitled=Basliksiz +Change GMenu2X wallpaper=GMenu2X arka plan resmini degistir +Activate/deactivate tv-out=TV-Out aktive/deaktive et +Select wallpaper=Arka plan resmi seç +Gamma=Gamma +Set gp2x gamma value (default: 10)=gp2x gamma degerini degistir (Standart: 10) +Tv-Out encoding=TV-Out Sinyali +Encoding of the tv-out signal=TV-Out formati ayari +Tweak RAM Timings=Hafiza hizlandirmasi +This usually speeds up the application at the cost of stability=Programlari hizlandirir ancak stabilitelerini düsürür +Gamma (default: 0)=Gamma (Standart: 0) +Gamma value to set when launching this link=Bu linki çalistirirken kullanilacak gamma degeri +ON=Açik +OFF=Kapali +File Browser=Dosya seçici +Directory Browser=Klasör seçici diff --git a/src/FastDelegate.h b/src/FastDelegate.h new file mode 100644 index 0000000..98c4b01 --- /dev/null +++ b/src/FastDelegate.h @@ -0,0 +1,2108 @@ +// FastDelegate.h +// Efficient delegates in C++ that generate only two lines of asm code! +// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp +// +// - Don Clugston, Mar 2004. +// Major contributions were made by Jody Hagins. +// History: +// 24-Apr-04 1.0 * Submitted to CodeProject. +// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. +// * Improved syntax for horrible_cast (thanks Paul Bludov). +// * Tested on Metrowerks MWCC and Intel ICL (IA32) +// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. +// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 +// * Now works on /clr "managed C++" code on VC7, VC7.1 +// * Comeau C++ now compiles without warnings. +// * Prevent the virtual inheritance case from being used on +// VC6 and earlier, which generate incorrect code. +// * Improved warning and error messages. Non-standard hacks +// now have compile-time checks to make them safer. +// * implicit_cast used instead of static_cast in many cases. +// * If calling a const member function, a const class pointer can be used. +// * MakeDelegate() global helper function added to simplify pass-by-value. +// * Added fastdelegate.clear() +// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) +// 30-Oct-04 1.3 * Support for (non-void) return values. +// * No more workarounds in client code! +// MSVC and Intel now use a clever hack invented by John Dlugosz: +// - The FASTDELEGATEDECLARE workaround is no longer necessary. +// - No more warning messages for VC6 +// * Less use of macros. Error messages should be more comprehensible. +// * Added include guards +// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). +// * Now tested on VS 2005 Express Beta, PGI C++ +// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. +// * <,>,<=,>= comparison operators to allow storage in ordered containers. +// * Substantial reduction of code size, especially the 'Closure' class. +// * Standardised all the compiler-specific workarounds. +// * MFP conversion now works for CodePlay (but not yet supported in the full code). +// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 +// * New syntax: FastDelegate< int (char *, double) >. +// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). +// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. +// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" +// * Fully supported by CodePlay VectorC +// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! +// * More optimal assignment,== and != operators for static function pointers. + +#ifndef FASTDELEGATE_H +#define FASTDELEGATE_H +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include // to allow <,> comparisons + +//////////////////////////////////////////////////////////////////////////////// +// Configuration options +// +//////////////////////////////////////////////////////////////////////////////// + +// Uncomment the following #define for optimally-sized delegates. +// In this case, the generated asm code is almost identical to the code you'd get +// if the compiler had native support for delegates. +// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). +// Thus, it will not work for DOS compilers using the medium model. +// It will also probably fail on some DSP systems. +#define FASTDELEGATE_USESTATICFUNCTIONHACK + +// Uncomment the next line to allow function declarator syntax. +// It is automatically enabled for those compilers where it is known to work. +//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Compiler identification for workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Compiler identification. It's not easy to identify Visual C++ because +// many vendors fraudulently define Microsoft's identifiers. +#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) +#define FASTDLGT_ISMSVC + +#if (_MSC_VER <1300) // Many workarounds are required for VC6. +#define FASTDLGT_VC6 +#pragma warning(disable:4786) // disable this ridiculous warning +#endif + +#endif + +// Does the compiler uses Microsoft's member function pointer structure? +// If so, it needs special treatment. +// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's +// identifier, _MSC_VER. We need to filter Metrowerks out. +#if defined(_MSC_VER) && !defined(__MWERKS__) +#define FASTDLGT_MICROSOFT_MFP + +#if !defined(__VECTOR_C) +// CodePlay doesn't have the __single/multi/virtual_inheritance keywords +#define FASTDLGT_HASINHERITANCE_KEYWORDS +#endif +#endif + +// Does it allow function declarator syntax? The following compilers are known to work: +#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. +#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. +#if defined (__MWERKS__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +#ifdef __GNUC__ // Workaround GCC bug #8271 + // At present, GCC doesn't recognize constness of MFPs in templates +#define FASTDELEGATE_GCC_BUG_8271 +#endif + + + +//////////////////////////////////////////////////////////////////////////////// +// General tricks used in this code +// +// (a) Error messages are generated by typdefing an array of negative size to +// generate compile-time errors. +// (b) Warning messages on MSVC are generated by declaring unused variables, and +// enabling the "variable XXX is never used" warning. +// (c) Unions are used in a few compiler-specific cases to perform illegal casts. +// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to +// (char *) first to ensure that the correct number of *bytes* are added. +// +//////////////////////////////////////////////////////////////////////////////// +// Helper templates +// +//////////////////////////////////////////////////////////////////////////////// + + +namespace fastdelegate { +namespace detail { // we'll hide the implementation details in a nested namespace. + +// implicit_cast< > +// I believe this was originally going to be in the C++ standard but +// was left out by accident. It's even milder than static_cast. +// I use it instead of static_cast<> to emphasize that I'm not doing +// anything nasty. +// Usage is identical to static_cast<> +template +inline OutputClass implicit_cast(InputClass input){ + return input; +} + +// horrible_cast< > +// This is truly evil. It completely subverts C++'s type system, allowing you +// to cast from any class to any other class. Technically, using a union +// to perform the cast is undefined behaviour (even in C). But we can see if +// it is OK by checking that the union is the same size as each of its members. +// horrible_cast<> should only be used for compiler-specific workarounds. +// Usage is identical to reinterpret_cast<>. + +// This union is declared outside the horrible_cast because BCC 5.5.1 +// can't inline a function with a nested class, and gives a warning. +template +union horrible_union{ + OutputClass out; + InputClass in; +}; + +template +inline OutputClass horrible_cast(const InputClass input){ + horrible_union u; + // Cause a compile-time error if in, out and u are not the same size. + // If the compile fails here, it means the compiler has peculiar + // unions which would prevent the cast from working. + typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) + && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + u.in = input; + return u.out; +} + +//////////////////////////////////////////////////////////////////////////////// +// Workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Backwards compatibility: This macro used to be necessary in the virtual inheritance +// case for Intel and Microsoft. Now it just forward-declares the class. +#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; + +// Prevent use of the static function hack with the DOS medium model. +#ifdef __MEDIUM__ +#undef FASTDELEGATE_USESTATICFUNCTIONHACK +#endif + +// DefaultVoid - a workaround for 'void' templates in VC6. +// +// (1) VC6 and earlier do not allow 'void' as a default template argument. +// (2) They also doesn't allow you to return 'void' from a function. +// +// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use +// when we'd like to use 'void'. We convert it into 'void' and back +// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. +// Workaround for (2): On VC6, the code for calling a void function is +// identical to the code for calling a non-void function in which the +// return value is never used, provided the return value is returned +// in the EAX register, rather than on the stack. +// This is true for most fundamental types such as int, enum, void *. +// Const void * is the safest option since it doesn't participate +// in any automatic conversions. But on a 16-bit compiler it might +// cause extra code to be generated, so we disable it for all compilers +// except for VC6 (and VC5). +#ifdef FASTDLGT_VC6 +// VC6 workaround +typedef const void * DefaultVoid; +#else +// On any other compiler, just use a normal void. +typedef void DefaultVoid; +#endif + +// Translate from 'DefaultVoid' to 'void'. +// Everything else is unchanged +template +struct DefaultVoidToVoid { typedef T type; }; + +template <> +struct DefaultVoidToVoid { typedef void type; }; + +// Translate from 'void' into 'DefaultVoid' +// Everything else is unchanged +template +struct VoidToDefaultVoid { typedef T type; }; + +template <> +struct VoidToDefaultVoid { typedef DefaultVoid type; }; + + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1: +// +// Conversion of member function pointer to a standard form +// +//////////////////////////////////////////////////////////////////////////////// + +// GenericClass is a fake class, ONLY used to provide a type. +// It is vitally important that it is never defined, so that the compiler doesn't +// think it can optimize the invocation. For example, Borland generates simpler +// code if it knows the class only uses single inheritance. + +// Compilers using Microsoft's structure need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS + // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP + // (4 bytes), even when the /vmg option is used. Declaring an empty class + // would give 16 byte pointers in this case.... + class __single_inheritance GenericClass; +#endif + // ...but for Codeplay, an empty class *always* gives 4 byte pointers. + // If compiled with the /clr option ("managed C++"), the JIT compiler thinks + // it needs to load GenericClass before it can call any of its functions, + // (compiles OK but crashes at runtime!), so we need to declare an + // empty class to make it happy. + // Codeplay and VC4 can't cope with the unknown_inheritance case either. + class GenericClass {}; +#else + class GenericClass; +#endif + +// The size of a single inheritance member function pointer. +const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); + +// SimplifyMemFunc< >::Convert() +// +// A template function that converts an arbitrary member function pointer into the +// simplest possible form of member function pointer, using a supplied 'this' pointer. +// According to the standard, this can be done legally with reinterpret_cast<>. +// For (non-standard) compilers which use member function pointers which vary in size +// depending on the class, we need to use knowledge of the internal structure of a +// member function pointer, as used by the compiler. Template specialization is used +// to distinguish between the sizes. Because some compilers don't support partial +// template specialisation, I use full specialisation of a wrapper struct. + +// general case -- don't know how to convert it. Force a compile failure +template +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // Unsupported member function type -- force a compile failure. + // (it's illegal to have a array with negative size). + typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + return 0; + } +}; + +// For compilers where all member func ptrs are the same size, everything goes here. +// For non-standard compilers, only single_inheritance classes go here. +template <> +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { +#if defined __DMC__ + // Digital Mars doesn't allow you to cast between abitrary PMF's, + // even though the standard says you can. The 32-bit compiler lets you + // static_cast through an int, but the DOS compiler doesn't. + bound_func = horrible_cast(function_to_bind); +#else + bound_func = reinterpret_cast(function_to_bind); +#endif + return reinterpret_cast(pthis); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1b: +// +// Workarounds for Microsoft and Intel +// +//////////////////////////////////////////////////////////////////////////////// + + +// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), +// need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) +// at the start of each function for extra safety, but VC6 seems to ICE +// intermittently if you do this inside a template. + +// __multiple_inheritance classes go here +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +template<> +struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // We need to use a horrible_cast to do this conversion. + // In MSVC, a multiple inheritance member pointer is internally defined as: + union { + XFuncType func; + struct { + GenericMemFuncType funcaddress; // points to the actual member function + int delta; // #BYTES to be added to the 'this' pointer + }s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); + } +}; + +// virtual inheritance is a real nuisance. It's inefficient and complicated. +// On MSVC and Intel, there isn't enough information in the pointer itself to +// enable conversion to a closure pointer. Earlier versions of this code didn't +// work for all cases, and generated a compile-time error instead. +// But a very clever hack invented by John M. Dlugosz solves this problem. +// My code is somewhat different to his: I have no asm code, and I make no +// assumptions about the calling convention that is used. + +// In VC++ and ICL, a virtual_inheritance member pointer +// is internally defined as: +struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance +}; +// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the +// m_codeptr member is *always* called, regardless of the values of the other +// members. (This is *not* true for other compilers, eg GCC, which obtain the +// function address from the vtable if a virtual function is being called). +// Dlugosz's trick is to make the codeptr point to a probe function which +// returns the 'this' pointer that was used. + +// Define a generic class that uses virtual inheritance. +// It has a trival member function that returns the value of the 'this' pointer. +struct GenericVirtualClass : virtual public GenericClass +{ + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } +}; + +// __virtual_inheritance classes go here +template <> +struct SimplifyMemFunc +{ + + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + union { + XFuncType func; + GenericClass* (X::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = function_to_bind; + bound_func = reinterpret_cast(u.s.codeptr); + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + && sizeof(function_to_bind)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + return (pthis->*u.ProbeFunc)(); + } +}; + +#if (_MSC_VER <1300) + +// Nasty hack for Microsoft Visual C++ 6.0 +// unknown_inheritance classes go here +// There is a compiler bug in MSVC6 which generates incorrect code in this case!! +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // There is an apalling but obscure compiler bug in MSVC6 and earlier: + // vtable_index and 'vtordisp' are always set to 0 in the + // unknown_inheritance case! + // This means that an incorrect function could be called!!! + // Compiling with the /vmg option leads to potentially incorrect code. + // This is probably the reason that the IDE has a user interface for specifying + // the /vmg option, but it is disabled - you can only specify /vmg on + // the command line. In VC1.5 and earlier, the compiler would ICE if it ever + // encountered this situation. + // It is OK to use the /vmg option if /vmm or /vms is specified. + + // Fortunately, the wrong function is only called in very obscure cases. + // It only occurs when a derived class overrides a virtual function declared + // in a virtual base class, and the member function + // points to the *Derived* version of that function. The problem can be + // completely averted in 100% of cases by using the *Base class* for the + // member fpointer. Ie, if you use the base class as an interface, you'll + // stay out of trouble. + // Occasionally, you might want to point directly to a derived class function + // that isn't an override of a base class. In this case, both vtable_index + // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. + // We can generate correct code in this case. To prevent an incorrect call from + // ever being made, on MSVC6 we generate a warning, and call a function to + // make the program crash instantly. + typedef char ERROR_VC6CompilerBug[-100]; + return 0; + } +}; + + +#else + +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +// unknown_inheritance classes go here +// This is probably the ugliest bit of code I've ever written. Look at the casts! +// There is a compiler bug in MSVC6 which prevents it from using this code. +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + XFuncType func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + GenericMemFuncType m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + const int * vtable = *reinterpret_cast( + reinterpret_cast(pthis) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + } + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + return reinterpret_cast( + reinterpret_cast(pthis) + u.s.delta + virtual_delta); + }; +}; +#endif // MSVC 7 and greater + +#endif // MS/Intel hacks + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 2: +// +// Define the delegate storage, and cope with static functions +// +//////////////////////////////////////////////////////////////////////////////// + +// DelegateMemento -- an opaque structure which can hold an arbitary delegate. +// It knows nothing about the calling convention or number of arguments used by +// the function pointed to. +// It supplies comparison operators so that it can be stored in STL collections. +// It cannot be set to anything other than null, nor invoked directly: +// it must be converted to a specific delegate. + +// Implementation: +// There are two possible implementations: the Safe method and the Evil method. +// DelegateMemento - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// A static function pointer is stored inside the class. +// Here are the valid values: +// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ +// | 0 | 0 | 0 | Empty | +// | !=0 |(dontcare)| Invoker | Static function| +// | 0 | !=0 | !=0* | Method call | +// +--------------------+----------+------------+----------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// When stored stored inside a specific delegate, the 'dontcare' entries are replaced +// with a reference to the delegate itself. This complicates the = and == operators +// for the delegate class. + +// DelegateMemento - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. In this case the DelegateMemento implementation is simple: +// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ +// | 0 | 0 | Empty | +// | !=0 | !=0* | Static function or method call| +// +----------+------------+-------------------------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + +class DelegateMemento { +protected: + // the data is protected, not private, because many + // compilers have problems with template friends. + typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. + GenericMemFuncType m_pFunction; + detail::GenericClass *m_pthis; + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + typedef void (*GenericFuncPtr)(); // arbitrary code pointer + GenericFuncPtr m_pStaticFunction; +#endif + +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; + void clear() { + m_pthis=0; m_pFunction=0; m_pStaticFunction=0; + } +#else + DelegateMemento() : m_pFunction(0), m_pthis(0) {}; + void clear() { m_pthis=0; m_pFunction=0; } +#endif +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + inline bool IsEqual (const DelegateMemento &x) const{ + // We have to cope with the static function pointers as a special case + if (m_pFunction!=x.m_pFunction) return false; + // the static function ptrs must either both be equal, or both be 0. + if (m_pStaticFunction!=x.m_pStaticFunction) return false; + if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; + else return true; + } +#else // Evil Method + inline bool IsEqual (const DelegateMemento &x) const{ + return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; + } +#endif + // Provide a strict weak ordering for DelegateMementos. + inline bool IsLess(const DelegateMemento &right) const { + // deal with static function pointers first +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) + return m_pStaticFunction < right.m_pStaticFunction; +#endif + if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; + // There are no ordering operators for member function pointers, + // but we can fake one by comparing each byte. The resulting ordering is + // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. + return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; + + } + // BUGFIX (Mar 2005): + // We can't just compare m_pFunction because on Metrowerks, + // m_pFunction can be zero even if the delegate is not empty! + inline bool operator ! () const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } + inline bool empty() const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } +public: + DelegateMemento & operator = (const DelegateMemento &right) { + SetMementoFrom(right); + return *this; + } + inline bool operator <(const DelegateMemento &right) { + return IsLess(right); + } + inline bool operator >(const DelegateMemento &right) { + return right.IsLess(*this); + } + DelegateMemento (const DelegateMemento &right) : + m_pFunction(right.m_pFunction), m_pthis(right.m_pthis) +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + , m_pStaticFunction (right.m_pStaticFunction) +#endif + {} +protected: + void SetMementoFrom(const DelegateMemento &right) { + m_pFunction = right.m_pFunction; + m_pthis = right.m_pthis; +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = right.m_pStaticFunction; +#endif + } +}; + + +// ClosurePtr<> +// +// A private wrapper class that adds function signatures to DelegateMemento. +// It's the class that does most of the actual work. +// The signatures are specified by: +// GenericMemFunc: must be a type of GenericClass member function pointer. +// StaticFuncPtr: must be a type of function pointer with the same signature +// as GenericMemFunc. +// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 +// where it never returns void (returns DefaultVoid instead). + +// An outer class, FastDelegateN<>, handles the invoking and creates the +// necessary typedefs. +// This class does everything else. + +namespace detail { + +template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> +class ClosurePtr : public DelegateMemento { +public: + // These functions are for setting the delegate to a member function. + + // Here's the clever bit: we convert an arbitrary member function into a + // standard form. XMemFunc should be a member function of class X, but I can't + // enforce that here. It needs to be enforced by the wrapper class. + template < class X, class XMemFunc > + inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { + m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(pthis, function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } + // For const member functions, we only need a const class pointer. + // Since we know that the member function is const, it's safe to + // remove the const qualifier from the 'this' pointer with a const_cast. + // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. + template < class X, class XMemFunc> + inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { + m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(const_cast(pthis), function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates + template < class X, class XMemFunc> + inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { + bindconstmemfunc(pthis, function_to_bind); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#endif + // These functions are required for invoking the stored function + inline GenericClass *GetClosureThis() const { return m_pthis; } + inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } + +// There are a few ways of dealing with static function pointers. +// There's a standard-compliant, but tricky method. +// There's also a straightforward hack, that won't work on DOS compilers using the +// medium memory model. It's so evil that I can't recommend it, but I've +// implemented it anyway because it produces very nice asm code. + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + +// ClosurePtr<> - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// I store the function pointer inside the class, and the delegate then +// points to itself. Whenever the delegate is copied, these self-references +// must be transformed, and this complicates the = and == operators. +public: + // The next two functions are for operator ==, =, and the copy constructor. + // We may need to convert the m_pthis pointers, so that + // they remain as self-references. + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { + SetMementoFrom(x); + if (m_pStaticFunction!=0) { + // transform self references... + m_pthis=reinterpret_cast(pParent); + } + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + template < class DerivedClass, class ParentInvokerSig > + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind ) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + bindmemfunc(pParent, static_function_invoker); + } + m_pStaticFunction=reinterpret_cast(function_to_bind); + } + inline UnvoidStaticFuncPtr GetStaticFunction() const { + return reinterpret_cast(m_pStaticFunction); + } +#else + +// ClosurePtr<> - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and +// speeds up comparison and assignment. If C++ provided direct language support +// for delegates, they would produce asm code that was almost identical to this. +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { + SetMementoFrom(right); + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + // ******** EVIL, EVIL CODE! ******* + template < class DerivedClass, class ParentInvokerSig> + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + // We'll be ignoring the 'this' pointer, but we need to make sure we pass + // a valid value to bindmemfunc(). + bindmemfunc(pParent, static_function_invoker); + } + + // WARNING! Evil hack. We store the function in the 'this' pointer! + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + m_pthis = horrible_cast(function_to_bind); + // MSVC, SunC++ and DMC accept the following (non-standard) code: +// m_pthis = static_cast(static_cast(function_to_bind)); + // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long +// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); + } + // ******** EVIL, EVIL CODE! ******* + // This function will be called with an invalid 'this' pointer!! + // We're just returning the 'this' pointer, converted into + // a function pointer! + inline UnvoidStaticFuncPtr GetStaticFunction() const { + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + return horrible_cast(this); + } +#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + + // Does the closure contain this static function? + inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ + if (funcptr==0) return empty(); + // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary + // value that is not equal to any valid function pointer. + else return funcptr==reinterpret_cast(GetStaticFunction()); + } +}; + + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 3: +// +// Wrapper classes to ensure type safety +// +//////////////////////////////////////////////////////////////////////////////// + + +// Once we have the member function conversion templates, it's easy to make the +// wrapper classes. So that they will work with as many compilers as possible, +// the classes are of the form +// FastDelegate3 +// They can cope with any combination of parameters. The max number of parameters +// allowed is 8, but it is trivial to increase this limit. +// Note that we need to treat const member functions seperately. +// All this class does is to enforce type safety, and invoke the delegate with +// the correct list of parameters. + +// Because of the weird rule about the class of derived member function pointers, +// you sometimes need to apply a downcast to the 'this' pointer. +// This is the reason for the use of "implicit_cast(pthis)" in the code below. +// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, +// without this trick you'd need to write: +// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); +// but with the trick you can write +// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); + +// RetType is the type the compiler uses in compiling the template. For VC6, +// it cannot be void. DesiredRetType is the real type which is returned from +// all of the functions. It can be void. + +// Implicit conversion to "bool" is achieved using the safe_bool idiom, +// using member data pointers (MDP). This allows "if (dg)..." syntax +// Because some compilers (eg codeplay) don't have a unique value for a zero +// MDP, an extra padding member is added to the SafeBool struct. +// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so +// in that case the static function constructor is not made explicit; this +// allows "if (dg==0) ..." to compile. + +//N=0 +template +class FastDelegate0 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(); + typedef RetType (*UnvoidStaticFunctionPtr)(); + typedef RetType (detail::GenericClass::*GenericMemFn)(); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate0 type; + + // Construction and comparison functions + FastDelegate0() { clear(); } + FastDelegate0(const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate0 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate0 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate0 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate0 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate0(DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)()) { + m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() () const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction() const { + return (*(m_Closure.GetStaticFunction()))(); } +}; + +//N=1 +template +class FastDelegate1 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate1 type; + + // Construction and comparison functions + FastDelegate1() { clear(); } + FastDelegate1(const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate1 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate1 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate1 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate1 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { + m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1) const { + return (*(m_Closure.GetStaticFunction()))(p1); } +}; + +//N=2 +template +class FastDelegate2 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate2 type; + + // Construction and comparison functions + FastDelegate2() { clear(); } + FastDelegate2(const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate2 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate2 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate2 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate2 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2); } +}; + +//N=3 +template +class FastDelegate3 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate3 type; + + // Construction and comparison functions + FastDelegate3() { clear(); } + FastDelegate3(const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate3 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate3 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate3 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate3 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } +}; + +//N=4 +template +class FastDelegate4 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate4 type; + + // Construction and comparison functions + FastDelegate4() { clear(); } + FastDelegate4(const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate4 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate4 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate4 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate4 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } +}; + +//N=5 +template +class FastDelegate5 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate5 type; + + // Construction and comparison functions + FastDelegate5() { clear(); } + FastDelegate5(const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate5 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate5 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate5 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate5 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } +}; + +//N=6 +template +class FastDelegate6 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate6 type; + + // Construction and comparison functions + FastDelegate6() { clear(); } + FastDelegate6(const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate6 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate6 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate6 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate6 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } +}; + +//N=7 +template +class FastDelegate7 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate7 type; + + // Construction and comparison functions + FastDelegate7() { clear(); } + FastDelegate7(const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate7 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate7 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate7 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate7 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } +}; + +//N=8 +template +class FastDelegate8 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate8 type; + + // Construction and comparison functions + FastDelegate8() { clear(); } + FastDelegate8(const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate8 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate8 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate8 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate8 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 4: +// +// FastDelegate<> class (Original author: Jody Hagins) +// Allows boost::function style syntax like: +// FastDelegate< double (int, long) > +// instead of: +// FastDelegate2< int, long, double > +// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +// Declare FastDelegate as a class template. It will be specialized +// later for all number of arguments. +template +class FastDelegate; + +//N=0 +// Specialization to allow use of +// FastDelegate< R ( ) > +// instead of +// FastDelegate0 < R > +template +class FastDelegate< R ( ) > + // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 + : public FastDelegate0 < R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate0 < R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=1 +// Specialization to allow use of +// FastDelegate< R ( Param1 ) > +// instead of +// FastDelegate1 < Param1, R > +template +class FastDelegate< R ( Param1 ) > + // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 + : public FastDelegate1 < Param1, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate1 < Param1, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=2 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2 ) > +// instead of +// FastDelegate2 < Param1, Param2, R > +template +class FastDelegate< R ( Param1, Param2 ) > + // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 + : public FastDelegate2 < Param1, Param2, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate2 < Param1, Param2, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=3 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3 ) > +// instead of +// FastDelegate3 < Param1, Param2, Param3, R > +template +class FastDelegate< R ( Param1, Param2, Param3 ) > + // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 + : public FastDelegate3 < Param1, Param2, Param3, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=4 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > +// instead of +// FastDelegate4 < Param1, Param2, Param3, Param4, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > + // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 + : public FastDelegate4 < Param1, Param2, Param3, Param4, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=5 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > +// instead of +// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > + // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 + : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=6 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > +// instead of +// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > + // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 + : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=7 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > +// instead of +// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > + // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 + : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=8 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > +// instead of +// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > + // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 + : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 5: +// +// MakeDelegate() helper function +// +// MakeDelegate(&x, &X::func) returns a fastdelegate of the type +// necessary for calling x.func() with the correct number of arguments. +// This makes it possible to eliminate many typedefs from user code. +// +//////////////////////////////////////////////////////////////////////////////// + +// Also declare overloads of a MakeDelegate() global function to +// reduce the need for typedefs. +// We need seperate overloads for const and non-const member functions. +// Also, because of the weird rule about the class of derived member function pointers, +// implicit downcasts may need to be applied later to the 'this' pointer. +// That's why two classes (X and Y) appear in the definitions. Y must be implicitly +// castable to X. + +// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. +// GCC 3.2 and later won't compile this unless it's preceded by 'typename', +// but VC6 doesn't allow 'typename' in this context. +// So, I have to use a macro. + +#ifdef FASTDLGT_VC6 +#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type +#else +#define FASTDLGT_RETTYPE RetType +#endif + +//N=0 +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { + return FastDelegate0(x, func); +} + +//N=1 +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { + return FastDelegate1(x, func); +} + +//N=2 +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { + return FastDelegate2(x, func); +} + +//N=3 +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { + return FastDelegate3(x, func); +} + +//N=4 +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + return FastDelegate4(x, func); +} + +//N=5 +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + return FastDelegate5(x, func); +} + +//N=6 +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + return FastDelegate6(x, func); +} + +//N=7 +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + return FastDelegate7(x, func); +} + +//N=8 +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + return FastDelegate8(x, func); +} + + + // clean up after ourselves... +#undef FASTDLGT_RETTYPE + +} // namespace fastdelegate + +#endif // !defined(FASTDELEGATE_H) + diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..76d31f8 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,15 @@ +bin_PROGRAMS = gmenu2x +# +gmenu2x_SOURCES = asfont.cpp button.cpp cpu.cpp dirdialog.cpp filedialog.cpp filelister.cpp gmenu2x.cpp iconbutton.cpp imagedialog.cpp inputdialog.cpp inputmanager.cpp linkaction.cpp linkapp.cpp link.cpp listviewitem.cpp menu.cpp menusettingbool.cpp menusetting.cpp menusettingdir.cpp menusettingfile.cpp menusettingimage.cpp menusettingint.cpp menusettingmultistring.cpp menusettingrgba.cpp menusettingstring.cpp messagebox.cpp pxml.cpp selector.cpp selectordetector.cpp settingsdialog.cpp sfontplus.cpp surfacecollection.cpp surface.cpp textdialog.cpp textmanualdialog.cpp touchscreen.cpp translator.cpp utilities.cpp wallpaperdialog.cpp listview.cpp tinyxml/tinystr.cpp tinyxml/tinyxml.cpp tinyxml/tinyxmlerror.cpp tinyxml/tinyxmlparser.cpp + +noinst_HEADERS = asfont.h button.h cpu.h dirdialog.h FastDelegate.h filedialog.h filelister.h gmenu2x.h gp2x.h iconbutton.h imagedialog.h inputdialog.h inputmanager.h jz4740.h linkaction.h linkapp.h link.h listview.h listviewitem.h menu.h menusettingbool.h menusettingdir.h menusettingfile.h menusetting.h menusettingimage.h menusettingint.h menusettingmultistring.h menusettingrgba.h menusettingstring.h messagebox.h pxml.h selectordetector.h selector.h settingsdialog.h sfontplus.h surfacecollection.h surface.h textdialog.h textmanualdialog.h touchscreen.h translator.h utilities.h wallpaperdialog.h tinyxml/tinystr.h tinyxml/tinyxml.h + +AM_CFLAGS= @CFLAGS@ @SDL_CFLAGS@ + +AM_CXXFLAGS = @CXXFLAGS@ @SDL_CFLAGS@ + +gmenu2x_LDADD = @LIBS@ @SDL_LIBS@ + +gmenu2x_LDFLAGS = -L/home/vegyraupe/work/qi/NanoNote/Ben/sw/tinyxml + +gmenu2x_LIBS = @LIBS@ @SDL_LIBS@ -L./sparsehash/ -I./obj/gp2x/tinyxml/ \ No newline at end of file diff --git a/src/asfont.cpp b/src/asfont.cpp new file mode 100644 index 0000000..e6cfdbb --- /dev/null +++ b/src/asfont.cpp @@ -0,0 +1,124 @@ +#include "asfont.h" +#include "surface.h" +#include "utilities.h" + +#include + +using namespace std; + +ASFont::ASFont(SDL_Surface* font) { + this->font.initFont(font); + halfHeight = getHeight()/2; + halfLineHeight = getLineHeight()/2; +} + +ASFont::ASFont(Surface* font) { + this->font.initFont(font->raw); + halfHeight = getHeight()/2; + halfLineHeight = getLineHeight()/2; +} + +ASFont::ASFont(string font) { + this->font.initFont(font); + halfHeight = getHeight()/2; + halfLineHeight = getLineHeight()/2; +} + +ASFont::~ASFont() { + font.freeFont(); +} + +bool ASFont::utf8Code(unsigned char c) { + return font.utf8Code(c); +} + +void ASFont::write(SDL_Surface* surface, const char* text, int x, int y) { + font.write(surface, text, x, y); +} + +void ASFont::write(SDL_Surface* surface, const std::string& text, int x, int y, const unsigned short halign, const unsigned short valign) { + switch (halign) { + case SFontHAlignCenter: + x -= getTextWidth(text)/2; + break; + case SFontHAlignRight: + x -= getTextWidth(text); + break; + } + + switch (valign) { + case SFontVAlignMiddle: + y -= getHalfHeight(); + break; + case SFontVAlignBottom: + y -= getHeight(); + break; + } + + font.write(surface, text, x, y); +} +void ASFont::write(SDL_Surface* surface, vector *text, int x, int y, const unsigned short halign, const unsigned short valign) { + switch (valign) { + case SFontVAlignMiddle: + y -= getHalfHeight()*text->size(); + break; + case SFontVAlignBottom: + y -= getHeight()*text->size(); + break; + } + + for (uint i=0; isize(); i++) { + int ix = x; + switch (halign) { + case SFontHAlignCenter: + ix -= getTextWidth(text->at(i))/2; + break; + case SFontHAlignRight: + ix -= getTextWidth(text->at(i)); + break; + } + + font.write(surface, text->at(i), x, y+getHeight()*i); + } +} + +void ASFont::write(Surface* surface, const std::string& text, int x, int y, const unsigned short halign, const unsigned short valign) { + if (text.find("\n",0)!=string::npos) { + vector textArr; + split(textArr,text,"\n"); + write(surface->raw, &textArr, x, y, halign, valign); + } else + write(surface->raw, text, x, y, halign, valign); +} + +int ASFont::getHeight() { + return font.getHeight(); +} +int ASFont::getHalfHeight() { + return halfHeight; +} + +int ASFont::getLineHeight() { + return font.getLineHeight(); +} +int ASFont::getHalfLineHeight() { + return halfLineHeight; +} + +int ASFont::getTextWidth(const char* text) { + return font.getTextWidth(text); +} +int ASFont::getTextWidth(const std::string& text) { + if (text.find("\n",0)!=string::npos) { + vector textArr; + split(textArr,text,"\n"); + return getTextWidth(&textArr); + } else + return getTextWidth(text.c_str()); +} +int ASFont::getTextWidth(vector *text) { + int w = 0; + for (uint i=0; isize(); i++) + w = max( getTextWidth(text->at(i).c_str()), w ); + return w; +} diff --git a/src/asfont.h b/src/asfont.h new file mode 100644 index 0000000..b28efcb --- /dev/null +++ b/src/asfont.h @@ -0,0 +1,49 @@ +//Advanced SFont by Massimiliano Torromeo (cpp wrapper around SFont) + +#ifndef ASFONT_H +#define ASFONT_H + +#include +#include +#include +#include "sfontplus.h" + +using std::string; +using std::vector; + +const unsigned short SFontHAlignLeft = 0; +const unsigned short SFontHAlignRight = 1; +const unsigned short SFontHAlignCenter = 2; +const unsigned short SFontVAlignTop = 0; +const unsigned short SFontVAlignBottom = 1; +const unsigned short SFontVAlignMiddle = 2; + +class Surface; + +class ASFont { +public: + ASFont(SDL_Surface* font); + ASFont(Surface* font); + ASFont(string font); + ~ASFont(); + + bool utf8Code(unsigned char c); + + int getHeight(); + int getHalfHeight(); + int getLineHeight(); + int getHalfLineHeight(); + int getTextWidth(const char* text); + int getTextWidth(const string& text); + int getTextWidth(vector *text); + void write(SDL_Surface* surface, const char* text, int x, int y); + void write(SDL_Surface* surface, const std::string& text, int x, int y, const unsigned short halign = 0, const unsigned short valign = 0); + void write(SDL_Surface* surface, vector *text, int x, int y, const unsigned short halign = 0, const unsigned short valign = 0); + void write(Surface* surface, const std::string& text, int x, int y, const unsigned short halign = 0, const unsigned short valign = 0); + +private: + SFontPlus font; + int halfHeight, halfLineHeight; +}; + +#endif /* ASFONT_H */ diff --git a/src/button.cpp b/src/button.cpp new file mode 100644 index 0000000..ff61fae --- /dev/null +++ b/src/button.cpp @@ -0,0 +1,71 @@ +#include "button.h" +#include "gmenu2x.h" + +using namespace std; +using namespace fastdelegate; + +Button::Button(GMenu2X * gmenu2x, bool doubleClick) { + this->gmenu2x = gmenu2x; + this->doubleClick = doubleClick; + lastTick = 0; + action = MakeDelegate(this, &Button::voidAction); + rect.x = 0; + rect.y = 0; + rect.w = 0; + rect.h = 0; +} + +void Button::paint() { + if (gmenu2x->ts.inRect(rect)) + if (!paintHover()) return; +} + +bool Button::paintHover() { + return false; +} + +bool Button::isPressed() { + return gmenu2x->ts.pressed() && gmenu2x->ts.inRect(rect); +} + +bool Button::isReleased() { + return gmenu2x->ts.released() && gmenu2x->ts.inRect(rect); +} + +bool Button::handleTS() { + if (isReleased()) { + if (doubleClick) { + int tickNow = SDL_GetTicks(); + if (tickNow - lastTick < 400) + exec(); + lastTick = tickNow; + } else { + exec(); + } + return true; + } + return false; +} + +void Button::exec() { + gmenu2x->ts.setHandled(); + action(); +} + +SDL_Rect Button::getRect() { + return rect; +} + +void Button::setSize(int w, int h) { + rect.w = w; + rect.h = h; +} + +void Button::setPosition(int x, int y) { + rect.x = x; + rect.y = y; +} + +void Button::setAction(ButtonAction action) { + this->action = action; +} diff --git a/src/button.h b/src/button.h new file mode 100644 index 0000000..ae5e106 --- /dev/null +++ b/src/button.h @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef BUTTON_H_ +#define BUTTON_H_ + +#include +#include +#include "FastDelegate.h" + +using std::string; +using fastdelegate::FastDelegate0; + +typedef FastDelegate0<> ButtonAction; +class GMenu2X; + +class Button { +protected: + GMenu2X *gmenu2x; + ButtonAction action; + SDL_Rect rect; + bool doubleClick; + int lastTick; + +public: + string path; + Button(GMenu2X *gmenu2x, bool doubleClick = false); + virtual ~Button() {}; + + SDL_Rect getRect(); + void setSize(int w, int h); + void setPosition(int x, int y); + + virtual void paint(); + virtual bool paintHover(); + + bool isPressed(); + bool isReleased(); + bool handleTS(); + void exec(); + void voidAction() {}; + void setAction(ButtonAction action); +}; + +#endif /*BUTTON_H_*/ diff --git a/src/cpu.cpp b/src/cpu.cpp new file mode 100644 index 0000000..94168f7 --- /dev/null +++ b/src/cpu.cpp @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include +#include "jz4740.h" +#include "cpu.h" + +inline int sdram_convert(unsigned int pllin,unsigned int *sdram_freq) +{ + register unsigned int ns, tmp; + + ns = 1000000000 / pllin; + /* Set refresh registers */ + tmp = SDRAM_TREF/ns; + tmp = tmp/64 + 1; + if (tmp > 0xff) tmp = 0xff; + *sdram_freq = tmp; + + return 0; + +} + +void pll_init(unsigned int clock) +{ + register unsigned int cfcr, plcr1; + unsigned int sdramclock = 0; + int n2FR[33] = { + 0, 0, 1, 2, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, + 9 + }; + //int div[5] = {1, 4, 4, 4, 4}; /* divisors of I:S:P:L:M */ + int div[5] = {1, 3, 3, 3, 3}; /* divisors of I:S:P:L:M */ + int nf, pllout2; + + cfcr = CPM_CPCCR_CLKOEN | + (n2FR[div[0]] << CPM_CPCCR_CDIV_BIT) | + (n2FR[div[1]] << CPM_CPCCR_HDIV_BIT) | + (n2FR[div[2]] << CPM_CPCCR_PDIV_BIT) | + (n2FR[div[3]] << CPM_CPCCR_MDIV_BIT) | + (n2FR[div[4]] << CPM_CPCCR_LDIV_BIT); + + pllout2 = (cfcr & CPM_CPCCR_PCS) ? clock : (clock / 2); + + /* Init UHC clock */ +// REG_CPM_UHCCDR = pllout2 / 48000000 - 1; + jz_cpmregl[0x6C>>2] = pllout2 / 48000000 - 1; + + nf = clock * 2 / CFG_EXTAL; + plcr1 = ((nf - 2) << CPM_CPPCR_PLLM_BIT) | /* FD */ + (0 << CPM_CPPCR_PLLN_BIT) | /* RD=0, NR=2 */ + (0 << CPM_CPPCR_PLLOD_BIT) | /* OD=0, NO=1 */ + (0x20 << CPM_CPPCR_PLLST_BIT) | /* PLL stable time */ + CPM_CPPCR_PLLEN; /* enable PLL */ + + /* init PLL */ +// REG_CPM_CPCCR = cfcr; +// REG_CPM_CPPCR = plcr1; + jz_cpmregl[0] = cfcr; + jz_cpmregl[0x10>>2] = plcr1; + + sdram_convert(clock,&sdramclock); + if(sdramclock > 0) + { +// REG_EMC_RTCOR = sdramclock; +// REG_EMC_RTCNT = sdramclock; + jz_emcregs[0x8C>>1] = sdramclock; + jz_emcregs[0x88>>1] = sdramclock; + + }else + { + printf("sdram init fail!\n"); + while(1); + } + +} + + +void jz_cpuspeed(unsigned clockspeed) +{ + if (clockspeed >= 200 && clockspeed <= 430) + { + jz_dev = open("/dev/mem", O_RDWR); + if(jz_dev) + { + jz_cpmregl=(unsigned long *)mmap(0, 0x80, PROT_READ|PROT_WRITE, MAP_SHARED, jz_dev, 0x10000000); + jz_emcregl=(unsigned long *)mmap(0, 0x90, PROT_READ|PROT_WRITE, MAP_SHARED, jz_dev, 0x13010000); + jz_emcregs=(unsigned short *)jz_emcregl; + pll_init(clockspeed*1000000); + munmap((void *)jz_cpmregl, 0x80); + munmap((void *)jz_emcregl, 0x90); + close(jz_dev); + } + else + printf("failed opening /dev/mem \n"); + } +} diff --git a/src/cpu.h b/src/cpu.h new file mode 100644 index 0000000..7a05c7e --- /dev/null +++ b/src/cpu.h @@ -0,0 +1,24 @@ +#ifndef CPU_H +#define CPU_H + +/* Define this to the CPU frequency */ +#define CPU_FREQ 336000000 /* CPU clock: 336 MHz */ +#define CFG_EXTAL 12000000 /* EXT clock: 12 Mhz */ + +// SDRAM Timings, unit: ns +#define SDRAM_TRAS 45 /* RAS# Active Time */ +#define SDRAM_RCD 20 /* RAS# to CAS# Delay */ +#define SDRAM_TPC 20 /* RAS# Precharge Time */ +#define SDRAM_TRWL 7 /* Write Latency Time */ +#define SDRAM_TREF 15625 /* Refresh period: 4096 refresh cycles/64ms */ +//#define SDRAM_TREF 7812 /* Refresh period: 8192 refresh cycles/64ms */ + +static unsigned long jz_dev; +static volatile unsigned long *jz_cpmregl, *jz_emcregl; +volatile unsigned short *jz_emcregs; + +void jz_cpuspeed(unsigned clockspeed); +void pll_init(unsigned int clock); +inline int sdram_convert(unsigned int pllin,unsigned int *sdram_freq); + +#endif diff --git a/src/dirdialog.cpp b/src/dirdialog.cpp new file mode 100644 index 0000000..c495a74 --- /dev/null +++ b/src/dirdialog.cpp @@ -0,0 +1,202 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +//for browsing the filesystem +#include +#include +#include + +#include "dirdialog.h" +#include "filelister.h" +#include "FastDelegate.h" + +using namespace std; +using namespace fastdelegate; + +DirDialog::DirDialog(GMenu2X *gmenu2x, string text, string dir) { + this->gmenu2x = gmenu2x; + this->text = text; + selRow = 0; + if (dir.empty()) + path = "/card"; + else + path = dir; + + //Delegates + ButtonAction actionUp = MakeDelegate(this, &DirDialog::up); + ButtonAction actionEnter = MakeDelegate(this, &DirDialog::enter); + ButtonAction actionConfirm = MakeDelegate(this, &DirDialog::confirm); + + btnUp = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Up one folder"]); + btnUp->setAction(actionUp); + + btnEnter = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Enter folder"]); + btnEnter->setAction(actionEnter); + + btnConfirm = new IconButton(gmenu2x, "skin:imgs/buttons/start.png", gmenu2x->tr["Confirm"]); + btnConfirm->setAction(actionConfirm); +} + +bool DirDialog::exec() { + bool ts_pressed = false; + uint i, firstElement = 0, iY, action; + + if (!fileExists(path)) + path = "/card"; + + fl = new FileLister(path,true,false); + fl->browse(); + + selected = 0; + close = false; + result = true; + + uint rowHeight = gmenu2x->font->getHeight()+1; // gp2x=15+1 / pandora=19+1 + uint numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight; + SDL_Rect clipRect = {0, gmenu2x->skinConfInt["topBarHeight"]+1, gmenu2x->resX-9, gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-25}; + SDL_Rect touchRect = {2, gmenu2x->skinConfInt["topBarHeight"]+4, gmenu2x->resX-12, clipRect.h}; + while (!close) { + action = DirDialog::ACT_NONE; + if (gmenu2x->f200) gmenu2x->ts.poll(); + + gmenu2x->bg->blit(gmenu2x->s,0,0); + gmenu2x->drawTitleIcon("icons/explorer.png",true); + gmenu2x->writeTitle("Directory Browser"); + gmenu2x->writeSubTitle(text); + + gmenu2x->drawButton(btnConfirm, + gmenu2x->drawButton(btnUp, + gmenu2x->drawButton(btnEnter, 5))); + + if (selected>firstElement+numRows-1) firstElement=selected-numRows+1; + if (selectedskinConfInt["topBarHeight"]+1+(iY*rowHeight); + gmenu2x->s->box(2, iY, gmenu2x->resX-12, rowHeight-1, gmenu2x->skinConfColors["selectionBg"]); + + //Directories + gmenu2x->s->setClipRect(clipRect); + if (ts_pressed && !gmenu2x->ts.pressed()) { + action = DirDialog::ACT_SELECT; + ts_pressed = false; + } + if (gmenu2x->f200 && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false; + for (i=firstElement; isize() && isc.skinRes("imgs/folder.png")->blit(gmenu2x->s, 5, gmenu2x->skinConfInt["topBarHeight"]+1+(iY*rowHeight)); + gmenu2x->s->write(gmenu2x->font, fl->at(i), 24, gmenu2x->skinConfInt["topBarHeight"]+9+(iY*rowHeight), SFontHAlignLeft, SFontVAlignMiddle); + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, touchRect.y+(iY*rowHeight), touchRect.w, rowHeight)) { + ts_pressed = true; + selected = i; + } + } + gmenu2x->s->clearClipRect(); + + gmenu2x->drawScrollBar(numRows,fl->size(),firstElement,clipRect.y,clipRect.h); + gmenu2x->s->flip(); + + btnConfirm->handleTS(); + btnUp->handleTS(); + btnEnter->handleTS(); + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_SELECT] ) action = DirDialog::ACT_CLOSE; + if ( gmenu2x->input[ACTION_UP ] ) action = DirDialog::ACT_UP; + if ( gmenu2x->input[ACTION_L ] ) action = DirDialog::ACT_SCROLLUP; + if ( gmenu2x->input[ACTION_DOWN ] ) action = DirDialog::ACT_DOWN; + if ( gmenu2x->input[ACTION_R ] ) action = DirDialog::ACT_SCROLLDOWN; + if ( gmenu2x->input[ACTION_X] || gmenu2x->input[ACTION_LEFT] ) action = DirDialog::ACT_GOUP; + if ( gmenu2x->input[ACTION_B ] ) action = DirDialog::ACT_SELECT; + if ( gmenu2x->input[ACTION_START ] ) action = DirDialog::ACT_CONFIRM; + + if (action == DirDialog::ACT_SELECT && fl->at(selected)=="..") action = DirDialog::ACT_GOUP; + switch (action) { + case DirDialog::ACT_CLOSE: { + close = true; + result = false; + } break; + case DirDialog::ACT_UP: { + if (selected==0) + selected = fl->size()-1; + else + selected -= 1; + } break; + case DirDialog::ACT_SCROLLUP: { + if ((int)(selected-(numRows-2))<0) { + selected = 0; + } else { + selected -= numRows-2; + } + } break; + case DirDialog::ACT_DOWN: { + if (selected+1>=fl->size()) + selected = 0; + else + selected += 1; + } break; + case DirDialog::ACT_SCROLLDOWN: { + if (selected+(numRows-2)>=fl->size()) { + selected = fl->size()-1; + } else { + selected += numRows-2; + } + } break; + case DirDialog::ACT_GOUP: { + up(); + } break; + case DirDialog::ACT_SELECT: { + enter(); + } break; + case DirDialog::ACT_CONFIRM: { + confirm(); + } break; + } + } + + delete(fl); + + return result; +} + +void DirDialog::up() { + string::size_type p = path.rfind("/"); + if (p==string::npos || path.substr(0,11)!="/card" || p<4) { + close = true; + result = false; + } else { + path = path.substr(0,p); + selected = 0; + fl->setPath(path); + } +} + +void DirDialog::enter() { + path += "/"+fl->at(selected); + selected = 0; + fl->setPath(path); +} + +void DirDialog::confirm() { + close = true; +} diff --git a/src/dirdialog.h b/src/dirdialog.h new file mode 100644 index 0000000..42fd927 --- /dev/null +++ b/src/dirdialog.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef DIRDIALOG_H_ +#define DIRDIALOG_H_ + +#include +#include "gmenu2x.h" + +class FileLister; + +using std::string; +using std::vector; + +class DirDialog { +protected: + static const uint ACT_NONE = 0; + static const uint ACT_SELECT = 1; + static const uint ACT_CLOSE = 2; + static const uint ACT_UP = 3; + static const uint ACT_DOWN = 4; + static const uint ACT_SCROLLUP = 5; + static const uint ACT_SCROLLDOWN = 6; + static const uint ACT_GOUP = 7; + static const uint ACT_CONFIRM = 8; + +private: + int selRow; + uint selected; + bool close, result; + FileLister *fl; + string text; + IconButton *btnUp, *btnEnter, *btnConfirm; + GMenu2X *gmenu2x; + + void up(); + void enter(); + void confirm(); + +public: + string path; + DirDialog(GMenu2X *gmenu2x, string text, string dir=""); + + bool exec(); +}; + +#endif /*INPUTDIALOG_H_*/ diff --git a/src/filedialog.cpp b/src/filedialog.cpp new file mode 100644 index 0000000..99abde9 --- /dev/null +++ b/src/filedialog.cpp @@ -0,0 +1,187 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +//for browsing the filesystem +#include +#include +#include + +#include "filedialog.h" + +using namespace std; + +FileDialog::FileDialog(GMenu2X *gmenu2x, string text, string filter, string file) { + this->gmenu2x = gmenu2x; + this->text = text; + this->filter = filter; + this->file = ""; + setPath("/card"); + title = "File Browser"; + if (!file.empty()) { + string::size_type pos = file.rfind("/"); + if (pos != string::npos) { + setPath( file.substr(0, pos) ); + this->file = file.substr(pos+1,file.length()); + } + } + selRow = 0; +} + +bool FileDialog::exec() { + bool close = false, result = true, ts_pressed = false; + if (!fileExists(path())) + setPath("/card"); + + fl.setFilter(filter); + fl.browse(); + + uint i, firstElement = 0, iY, action; + uint rowHeight = gmenu2x->font->getHeight()+1; // gp2x=15+1 / pandora=19+1 + uint numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight; + SDL_Rect clipRect = {0, gmenu2x->skinConfInt["topBarHeight"]+1, gmenu2x->resX-9, gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-25}; + SDL_Rect touchRect = {2, gmenu2x->skinConfInt["topBarHeight"]+4, gmenu2x->resX-12, clipRect.h}; + + selected = 0; + while (!close) { + action = FD_NO_ACTION; + if (gmenu2x->f200) gmenu2x->ts.poll(); + + gmenu2x->bg->blit(gmenu2x->s,0,0); + gmenu2x->drawTitleIcon("icons/explorer.png",true); + gmenu2x->writeTitle(title); + gmenu2x->writeSubTitle(text); + + gmenu2x->drawButton(gmenu2x->s, "x", gmenu2x->tr["Up one folder"], + gmenu2x->drawButton(gmenu2x->s, "b", gmenu2x->tr["Enter folder/Confirm"], 5)); + + if (selected>firstElement+numRows-1) firstElement=selected-numRows+1; + if (selectedskinConfInt["topBarHeight"]+1+(iY*rowHeight); + gmenu2x->s->box(2, iY, gmenu2x->resX-12, rowHeight-1, gmenu2x->skinConfColors["selectionBg"]); + + beforeFileList(); + + //Files & Directories + gmenu2x->s->setClipRect(clipRect); + if (ts_pressed && !gmenu2x->ts.pressed()) { + action = FD_ACTION_SELECT; + ts_pressed = false; + } + if (gmenu2x->f200 && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false; + for (i=firstElement; isc.skinRes("imgs/go-up.png")->blit(gmenu2x->s, 5, gmenu2x->skinConfInt["topBarHeight"]+1+(iY*rowHeight)); + else + gmenu2x->sc.skinRes("imgs/folder.png")->blit(gmenu2x->s, 5, gmenu2x->skinConfInt["topBarHeight"]+1+(iY*rowHeight)); + } else { + gmenu2x->sc.skinRes("imgs/file.png")->blit(gmenu2x->s, 5, gmenu2x->skinConfInt["topBarHeight"]+1+(iY*rowHeight)); + } + gmenu2x->s->write(gmenu2x->font, fl[i], 24, gmenu2x->skinConfInt["topBarHeight"]+9+(iY*rowHeight), SFontHAlignLeft, SFontVAlignMiddle); + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, touchRect.y+(iY*rowHeight), touchRect.w, rowHeight)) { + ts_pressed = true; + selected = i; + } + } + gmenu2x->s->clearClipRect(); + + gmenu2x->drawScrollBar(numRows,fl.size(),firstElement,clipRect.y,clipRect.h); + gmenu2x->s->flip(); + + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_SELECT] ) action = FD_ACTION_CLOSE; + if ( gmenu2x->input[ACTION_UP ] ) action = FD_ACTION_UP; + if ( gmenu2x->input[ACTION_L ] ) action = FD_ACTION_SCROLLUP; + if ( gmenu2x->input[ACTION_DOWN ] ) action = FD_ACTION_DOWN; + if ( gmenu2x->input[ACTION_R ] ) action = FD_ACTION_SCROLLDOWN; + if ( gmenu2x->input[ACTION_X] || gmenu2x->input[ACTION_LEFT] ) action = FD_ACTION_GOUP; + if ( gmenu2x->input[ACTION_B ] ) action = FD_ACTION_SELECT; + + if (action == FD_ACTION_SELECT && fl[selected]=="..") action = FD_ACTION_GOUP; + switch (action) { + case FD_ACTION_CLOSE: { + close = true; + result = false; + } break; + case FD_ACTION_UP: { + if (selected==0) + selected = fl.size()-1; + else + selected -= 1; + } break; + case FD_ACTION_SCROLLUP: { + if ((int)(selected-(numRows-2))<0) { + selected = 0; + } else { + selected -= numRows-2; + } + } break; + case FD_ACTION_DOWN: { + if (selected+1>=fl.size()) + selected = 0; + else + selected += 1; + } break; + case FD_ACTION_SCROLLDOWN: { + if (selected+(numRows-2)>=fl.size()) { + selected = fl.size()-1; + } else { + selected += numRows-2; + } + } break; + case FD_ACTION_GOUP: { + string::size_type p = path().rfind("/"); + if (p==string::npos || path().substr(0,11)!="/card" || p<4) + return false; + else + setPath( path().substr(0,p) ); + } break; + case FD_ACTION_SELECT: { + if (fl.isDirectory(selected)) { + setPath( path()+"/"+fl[selected] ); + } else { + if (fl.isFile(selected)) { + file = fl[selected]; + close = true; + } + } + } break; + } + } + + return result; +} + +void FileDialog::setPath(string path) { + path_v = path; + fl.setPath(path); + selected = 0; + onChangeDir(); +} + +void FileDialog::beforeFileList() {} +void FileDialog::onChangeDir() {} diff --git a/src/filedialog.h b/src/filedialog.h new file mode 100644 index 0000000..605d742 --- /dev/null +++ b/src/filedialog.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef FILEDIALOG_H_ +#define FILEDIALOG_H_ + +#include +#include "filelister.h" +#include "gmenu2x.h" + +#define FD_NO_ACTION 0 +#define FD_ACTION_CLOSE 1 +#define FD_ACTION_UP 2 +#define FD_ACTION_DOWN 3 +#define FD_ACTION_LEFT 4 +#define FD_ACTION_RIGHT 5 +#define FD_ACTION_SCROLLDOWN 6 +#define FD_ACTION_SCROLLUP 7 +#define FD_ACTION_GOUP 8 +#define FD_ACTION_SELECT 9 + +using std::string; +using std::vector; + +class FileDialog { +protected: + int selRow; + string text, title; + GMenu2X *gmenu2x; + string filter; + FileLister fl; + uint selected; + string path_v; + +public: + string file; + FileDialog(GMenu2X *gmenu2x, string text, string filter="", string file=""); + virtual ~FileDialog() {}; + + virtual string path() { return path_v; }; + virtual void setPath(string path); + + inline virtual void beforeFileList(); + inline virtual void onChangeDir(); + bool exec(); +}; + +#endif /*INPUTDIALOG_H_*/ diff --git a/src/filelister.cpp b/src/filelister.cpp new file mode 100644 index 0000000..1b43c25 --- /dev/null +++ b/src/filelister.cpp @@ -0,0 +1,136 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +//for browsing the filesystem +#include +#include +#include +#include +#include + +#include "filelister.h" +#include "utilities.h" + +using namespace std; + +FileLister::FileLister(string startPath, bool showDirectories, bool showFiles) { + this->showDirectories = showDirectories; + this->showFiles = showFiles; + setPath(startPath,false); +} + +string FileLister::getPath() { + return path; +} +void FileLister::setPath(string path, bool doBrowse) { + if (path[path.length()-1]!='/') path += "/"; + this->path = path; + if (doBrowse) + browse(); +} + +string FileLister::getFilter() { + return filter; +} +void FileLister::setFilter(string filter) { + this->filter = filter; +} + +void FileLister::browse() { + directories.clear(); + files.clear(); + + if (showDirectories || showFiles) { + DIR *dirp; + if ((dirp = opendir(path.c_str())) == NULL) { + cout << "Error: opendir(" << path << ")" << endl; + return; + } + + vector vfilter; + split(vfilter,getFilter(),","); + + string filepath, file; + struct stat st; + struct dirent *dptr; + + while ((dptr = readdir(dirp))) { + file = dptr->d_name; + if (file[0]=='.' && file!="..") continue; + filepath = path+file; + int statRet = stat(filepath.c_str(), &st); + if (statRet == -1) { + cout << "\033[0;34mGMENU2X:\033[0;31m stat failed on '" << filepath << "' with error '" << strerror(errno) << "'\033[0m" << endl; + continue; + } + + if (find(exclude.begin(), exclude.end(), file) != exclude.end()) + continue; + + if (S_ISDIR(st.st_mode)) { + if (!showDirectories) continue; +#ifdef TARGET_GP2X +// if (!(path=="/card/" && (file!="sd" && file!="ext" && file!="nand"))) +#endif + directories.push_back(file); + } else { + if (!showFiles) continue; + bool filterOk = false; + for (uint i = 0; i=directories.size() && x +#include + +using std::string; +using std::vector; + +class FileLister { +private: + string path, filter; + bool showDirectories, showFiles; + +public: + FileLister(string startPath = "/boot/local", bool showDirectories = true, bool showFiles = true); + void browse(); + + vector directories, files, exclude; + uint size(); + uint dirCount(); + uint fileCount(); + string operator[](uint); + string at(uint); + bool isFile(uint); + bool isDirectory(uint); + + string getPath(); + void setPath(string path, bool doBrowse=true); + string getFilter(); + void setFilter(string filter); +}; + +#endif /*FILELISTER_H_*/ diff --git a/src/font-14.xcf b/src/font-14.xcf new file mode 100644 index 0000000000000000000000000000000000000000..3f2254771604af14c022cc96139570e309cbc032 GIT binary patch literal 34678 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "gp2x.h" +#include //for battery + +//for browsing the filesystem +#include +#include +#include + +//for soundcard +#include +#include + +#include "linkapp.h" +#include "linkaction.h" +#include "menu.h" +#include "asfont.h" +#include "sfontplus.h" +#include "surface.h" +#include "filedialog.h" +#include "gmenu2x.h" +#include "filelister.h" + +#include "iconbutton.h" +#include "messagebox.h" +#include "inputdialog.h" +#include "settingsdialog.h" +#include "wallpaperdialog.h" +#include "textdialog.h" +#include "menusettingint.h" +#include "menusettingbool.h" +#include "menusettingrgba.h" +#include "menusettingstring.h" +#include "menusettingmultistring.h" +#include "menusettingfile.h" +#include "menusettingimage.h" +#include "menusettingdir.h" + +#include + +#ifdef TARGET_PANDORA +//#include +//#include +//#include +#endif + +using namespace std; +using namespace fastdelegate; + +int main(int argc, char *argv[]) { + cout << "----" << endl; + cout << "GMenu2X starting: If you read this message in the logs, check http://gmenu2x.sourceforge.net/page/Troubleshooting for a solution" << endl; + cout << "----" << endl; + + signal(SIGINT,&exit); + GMenu2X app(argc,argv); + return 0; +} + +void GMenu2X::gp2x_init() { +#ifdef TARGET_GP2X +/* gp2x_mem = open("/dev/mem", O_RDWR); + gp2x_memregs=(unsigned short *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, gp2x_mem, 0xc0000000); + MEM_REG=&gp2x_memregs[0]; + if (f200) { + //if wm97xx fails to open, set f200 to false to prevent any further access to the touchscreen + f200 = ts.init(); + }*/ + batteryHandle = fopen("/sys/class/power_supply/battery/capacity", "r"); + usbHandle = fopen("/sys/class/power_supply/usb/online", "r"); + acHandle = fopen("/sys/class/power_supply/ac/online", "r"); + backlightHandle = fopen("/proc/jz/lcd_backlight","w+"); +#endif +} + +void GMenu2X::gp2x_deinit() { +#ifdef TARGET_GP2X +/* if (gp2x_mem!=0) { + gp2x_memregs[0x28DA>>1]=0x4AB; + gp2x_memregs[0x290C>>1]=640; + close(gp2x_mem); + } + + if (f200) ts.deinit();*/ +#endif + if (batteryHandle) fclose(batteryHandle); + if (backlightHandle) fclose(backlightHandle); + if (usbHandle) fclose(usbHandle); + if (acHandle) fclose(acHandle); +} + +void GMenu2X::gp2x_tvout_on(bool pal) { +#ifdef TARGET_GP2X +/* if (gp2x_mem!=0) { +// Ioctl_Dummy_t *msg; +// int TVHandle = ioctl(SDL_videofd, FBMMSP2CTRL, msg); + if (cx25874!=0) gp2x_tvout_off(); + //if tv-out is enabled without cx25874 open, stop + //if (gp2x_memregs[0x2800>>1]&0x100) return; + cx25874 = open("/dev/cx25874",O_RDWR); + ioctl(cx25874, _IOW('v', 0x02, unsigned char), pal ? 4 : 3); + gp2x_memregs[0x2906>>1]=512; + gp2x_memregs[0x28E4>>1]=gp2x_memregs[0x290C>>1]; + gp2x_memregs[0x28E8>>1]=239; + }*/ +#endif +} + +void GMenu2X::gp2x_tvout_off() { +#ifdef TARGET_GP2X +/* if (gp2x_mem!=0) { + close(cx25874); + cx25874 = 0; + gp2x_memregs[0x2906>>1]=1024; + }*/ +#endif +} + +GMenu2X::GMenu2X(int argc, char *argv[]) { + //Detect firmware version and type + if (fileExists("/etc/open2x")) { + fwType = "open2x"; + fwVersion = ""; + } else { + fwType = "gph"; + fwVersion = ""; + } +#ifdef TARGET_GP2X + f200 = fileExists("/dev/touchscreen/wm97xx"); +#else + f200 = true; +#endif + + confStr.set_empty_key(" "); + confStr.set_deleted_key(""); + confInt.set_empty_key(" "); + confInt.set_deleted_key(""); + skinConfInt.set_empty_key(" "); + skinConfInt.set_deleted_key(""); + skinConfStr.set_empty_key(" "); + skinConfStr.set_deleted_key(""); + skinConfColors.set_empty_key(" "); + skinConfColors.set_deleted_key(""); + + //open2x + savedVolumeMode = 0; + volumeMode = VOLUME_MODE_NORMAL; + volumeScalerNormal = VOLUME_SCALER_NORMAL; + volumeScalerPhones = VOLUME_SCALER_PHONES; + + o2x_usb_net_on_boot = false; + o2x_usb_net_ip = ""; + o2x_ftp_on_boot = false; + o2x_telnet_on_boot = false; + o2x_gp2xjoy_on_boot = false; + o2x_usb_host_on_boot = false; + o2x_usb_hid_on_boot = false; + o2x_usb_storage_on_boot = false; + + usbnet = samba = inet = web = false; + useSelectionPng = false; + + //load config data + readConfig(); + if (fwType=="open2x") { + readConfigOpen2x(); + // VOLUME MODIFIER + switch(volumeMode) { + case VOLUME_MODE_MUTE: setVolumeScaler(VOLUME_SCALER_MUTE); break; + case VOLUME_MODE_PHONES: setVolumeScaler(volumeScalerPhones); break; + case VOLUME_MODE_NORMAL: setVolumeScaler(volumeScalerNormal); break; + } + } else + readCommonIni(); + + halfX = resX/2; + halfY = resY/2; + bottomBarIconY = resY-18; + bottomBarTextY = resY-10; + + path = ""; + getExePath(); + +#ifdef TARGET_GP2X + gp2x_mem = 0; + cx25874 = 0; + batteryHandle = 0; + backlightHandle = 0; + usbHandle = 0; + acHandle = 0; + + gp2x_init(); + + //Fix tv-out +/* if (gp2x_mem!=0) { + if (gp2x_memregs[0x2800>>1]&0x100) { + gp2x_memregs[0x2906>>1]=512; + //gp2x_memregs[0x290C>>1]=640; + gp2x_memregs[0x28E4>>1]=gp2x_memregs[0x290C>>1]; + } + gp2x_memregs[0x28E8>>1]=239; + }*/ +#endif + + //Screen + if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_JOYSTICK)<0 ) { + cout << "\033[0;34mGMENU2X:\033[0;31m Could not initialize SDL:\033[0m " << SDL_GetError() << endl; + quit(); + } + + s = new Surface(); +#ifdef TARGET_GP2X + { + //I use a tmp variable to hide the cursor as soon as possible (and create the double buffer surface only after that) + //I'm forced to use SW surfaces since with HW there are issuse with changing the clock frequency + SDL_Surface *tmps = SDL_SetVideoMode(resX, resY, confInt["videoBpp"], SDL_SWSURFACE); + SDL_ShowCursor(0); + s->enableVirtualDoubleBuffer(tmps); + } +#else + s->raw = SDL_SetVideoMode(resX, resY, confInt["videoBpp"], SDL_HWSURFACE|SDL_DOUBLEBUF); +#endif + + bg = NULL; + font = NULL; + menu = NULL; + setSkin(confStr["skin"], false); + initMenu(); + + if (!fileExists(confStr["wallpaper"])) { +#ifdef DEBUG + cout << "Searching wallpaper" << endl; +#endif + FileLister fl("skins/"+confStr["skin"]+"/wallpapers",false,true); + fl.setFilter(".png,.jpg,.jpeg,.bmp"); + fl.browse(); + if (fl.files.size()<=0 && confStr["skin"] != "Default") + fl.setPath("skins/Default/wallpapers",true); + if (fl.files.size()>0) + confStr["wallpaper"] = fl.getPath()+fl.files[0]; + } + + initBG(); + input.init(path+"input.conf"); + setInputSpeed(); + initServices(); + setBacklight(confInt["backlight"]); + setVolume(confInt["globalVolume"]); + applyDefaultTimings(); + setClock(confInt["menuClock"]); + //recover last session + readTmp(); + if (lastSelectorElement>-1 && menu->selLinkApp()!=NULL && (!menu->selLinkApp()->getSelectorDir().empty() || !lastSelectorDir.empty())) + menu->selLinkApp()->selector(lastSelectorElement,lastSelectorDir); + +#ifdef DEBUG + cout << "Starting main()" << endl; +#endif + main(); + writeConfig(); + if (fwType=="open2x") writeConfigOpen2x(); + + quit(); + exit(0); +} + +GMenu2X::~GMenu2X() { + free(menu); + free(s); + free(font); +} + +void GMenu2X::quit() { + fflush(NULL); + sc.clear(); + s->free(); + SDL_Quit(); +#ifdef TARGET_GP2X +/* if (gp2x_mem!=0) { + //Fix tv-out + if (gp2x_memregs[0x2800>>1]&0x100) { + gp2x_memregs[0x2906>>1]=512; + gp2x_memregs[0x28E4>>1]=gp2x_memregs[0x290C>>1]; + } + gp2x_deinit(); + }*/ +#endif +} + +void GMenu2X::initBG() { + sc.del("bgmain"); + + if (bg != NULL) free(bg); + + if (!fileExists(confStr["wallpaper"])) { + bg = new Surface(s); + bg->box(0,0,resX,resY,0,0,0); + } else { + bg = new Surface(confStr["wallpaper"],false); + } + + drawTopBar(bg); + drawBottomBar(bg); + + Surface *bgmain = new Surface(bg); + sc.add(bgmain,"bgmain"); + + Surface sd("imgs/sd.png", confStr["skin"]); + Surface cpu("imgs/cpu.png", confStr["skin"]); + Surface volume("imgs/volume.png", confStr["skin"]); + string df = getDiskFree(); + + cout << "after diskfree" << endl; + + sd.blit( sc["bgmain"], 3, bottomBarIconY ); + sc["bgmain"]->write( font, df, 22, bottomBarTextY, SFontHAlignLeft, SFontVAlignMiddle ); + volumeX = 27+font->getTextWidth(df); + cout << "3 lines after diskfree" << endl; + volume.blit( sc["bgmain"], volumeX, bottomBarIconY ); + volumeX += 19; + cpuX = volumeX+font->getTextWidth("100")+5; + cpu.blit( sc["bgmain"], cpuX, bottomBarIconY ); + cpuX += 19; + manualX = cpuX+font->getTextWidth("300Mhz")+5; + + int serviceX = resX-38; + if (usbnet) { + if (web) { + Surface webserver("imgs/webserver.png", confStr["skin"]); + webserver.blit( sc["bgmain"], serviceX, bottomBarIconY ); + serviceX -= 19; + } + if (samba) { + Surface sambaS("imgs/samba.png", confStr["skin"]); + sambaS.blit( sc["bgmain"], serviceX, bottomBarIconY ); + serviceX -= 19; + } + if (inet) { + Surface inetS("imgs/inet.png", confStr["skin"]); + inetS.blit( sc["bgmain"], serviceX, bottomBarIconY ); + serviceX -= 19; + } + } + cout << "after usbnet if" << endl; +} + +void GMenu2X::initFont() { + if (font != NULL) { + free(font); + font = NULL; + } + + string fontFile = sc.getSkinFilePath("imgs/font.png"); + if (fontFile.empty()) { + cout << "Font png not found!" << endl; + quit(); + exit(-1); + } + font = new ASFont(fontFile); +} + +void GMenu2X::initMenu() { + //Menu structure handler + menu = new Menu(this); + for (uint i=0; isections.size(); i++) { + //Add virtual links in the applications section + if (menu->sections[i]=="applications") { + menu->addActionLink(i,"Explorer",MakeDelegate(this,&GMenu2X::explorer),tr["Launch an application"],"skin:icons/explorer.png"); + } + + //Add virtual links in the setting section + else if (menu->sections[i]=="settings") { + menu->addActionLink(i,"GMenu2X",MakeDelegate(this,&GMenu2X::options),tr["Configure GMenu2X's options"],"skin:icons/configure.png"); + if (fwType=="open2x") + menu->addActionLink(i,"Open2x",MakeDelegate(this,&GMenu2X::settingsOpen2x),tr["Configure Open2x system settings"],"skin:icons/o2xconfigure.png"); + menu->addActionLink(i,tr["Skin"],MakeDelegate(this,&GMenu2X::skinMenu),tr["Configure skin"],"skin:icons/skin.png"); + menu->addActionLink(i,tr["Wallpaper"],MakeDelegate(this,&GMenu2X::changeWallpaper),tr["Change GMenu2X wallpaper"],"skin:icons/wallpaper.png"); +#ifdef TARGET_GP2X +/* menu->addActionLink(i,"TV",MakeDelegate(this,&GMenu2X::toggleTvOut),tr["Activate/deactivate tv-out"],"skin:icons/tv.png"); + menu->addActionLink(i,"USB Sd",MakeDelegate(this,&GMenu2X::activateSdUsb),tr["Activate Usb on SD"],"skin:icons/usb.png"); + if (fwType=="gph" && !f200) + menu->addActionLink(i,"USB Nand",MakeDelegate(this,&GMenu2X::activateNandUsb),tr["Activate Usb on Nand"],"skin:icons/usb.png"); + //menu->addActionLink(i,"USB Root",MakeDelegate(this,&GMenu2X::activateRootUsb),tr["Activate Usb on the root of the Gp2x Filesystem"],"skin:icons/usb.png");*/ +#endif + if (fileExists(path+"log.txt")) + menu->addActionLink(i,tr["Log Viewer"],MakeDelegate(this,&GMenu2X::viewLog),tr["Displays last launched program's output"],"skin:icons/ebook.png"); + menu->addActionLink(i,tr["About"],MakeDelegate(this,&GMenu2X::about),tr["Info about GMenu2X"],"skin:icons/about.png"); + } + } + + menu->setSectionIndex(confInt["section"]); + menu->setLinkIndex(confInt["link"]); + + menu->loadIcons(); + + //DEBUG + //menu->addLink( "/card", "sample.pxml", "applications" ); +} + +void GMenu2X::about() { + vector text; + split(text,"GMenu2X is developed by Massimiliano \"Ryo\" Torromeo, and is released under the GPL-v2 license.\n\ +Website: http://gmenu2x.sourceforge.net\n\ +E-Mail & PayPal account: massimiliano.torromeo@gmail.com\n\ +\n\ +Thanks goes to...\n\ +\n\ + Contributors\n\ +----\n\ +NoidZ for his gp2x' buttons graphics\n\ +\n\ + Beta testers\n\ +----\n\ +Goemon4, PokeParadox, PSyMastR and Tripmonkey_uk\n\ +\n\ + Translators\n\ +----\n\ +English & Italian by me\n\ +French by Yodaz\n\ +Danish by claus\n\ +Dutch by superfly\n\ +Spanish by pedator\n\ +Portuguese (Portugal) by NightShadow\n\ +Slovak by Jozef\n\ +Swedish by Esslan and Micket\n\ +German by fusion_power, johnnysnet and Waldteufel\n\ +Finnish by Jontte and Atte\n\ +Norwegian by cowai\n\ +Russian by XaMMaX90\n\ +\n\ + Donors\n\ +----\n\ +EvilDragon (www.gp2x.de)\n\ +Tecnologie Creative (www.tecnologiecreative.it)\n\ +TelcoLou\n\ +gaterooze\n\ +deepmenace\n\ +superfly\n\ +halo9\n\ +sbock\n\ +b._.o._.b\n\ +Jacopastorius\n\ +lorystorm90\n\ +and all the anonymous donors...\n\ +(If I missed to list you or if you want to be removed, contact me.)","\n"); + TextDialog td(this, "GMenu2X", tr.translate("Version $1 (Build date: $2)","0.10-test4",__DATE__,NULL), "icons/about.png", &text); + td.exec(); +} + +void GMenu2X::viewLog() { + string logfile = path+"log.txt"; + if (fileExists(logfile)) { + ifstream inf(logfile.c_str(), ios_base::in); + if (inf.is_open()) { + vector log; + + string line; + while (getline(inf, line, '\n')) + log.push_back(line); + inf.close(); + + TextDialog td(this, tr["Log Viewer"], tr["Displays last launched program's output"], "icons/ebook.png", &log); + td.exec(); + + MessageBox mb(this, tr["Do you want to delete the log file?"], "icons/ebook.png"); + mb.buttons[ACTION_B] = tr["Yes"]; + mb.buttons[ACTION_X] = tr["No"]; + if (mb.exec() == ACTION_B) { + ledOn(); + unlink(logfile.c_str()); + sync(); + menu->deleteSelectedLink(); + ledOff(); + } + } + } +} + +void GMenu2X::readConfig() { + string conffile = path+"gmenu2x.conf"; + if (fileExists(conffile)) { + ifstream inf(conffile.c_str(), ios_base::in); + if (inf.is_open()) { + string line; + while (getline(inf, line, '\n')) { + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (value.length()>1 && value.at(0)=='"' && value.at(value.length()-1)=='"') + confStr[name] = value.substr(1,value.length()-2); + else + confInt[name] = atoi(value.c_str()); + } + inf.close(); + } + } + if (!confStr["lang"].empty()) tr.setLang(confStr["lang"]); + if (!confStr["wallpaper"].empty() && !fileExists(confStr["wallpaper"])) confStr["wallpaper"] = ""; + if (confStr["skin"].empty() || !fileExists("skins/"+confStr["skin"])) confStr["skin"] = "Default"; + + evalIntConf( &confInt["outputLogs"], 0, 0,1 ); + evalIntConf( &confInt["maxClock"], 430, 200,430 ); + evalIntConf( &confInt["menuClock"], 200, 200,430 ); + evalIntConf( &confInt["globalVolume"], 67, 0,100 ); + evalIntConf( &confInt["backlight"], 100, 5,100 ); + evalIntConf( &confInt["videoBpp"], 32,32,32 ); // 8,16 + + if (confStr["tvoutEncoding"] != "PAL") confStr["tvoutEncoding"] = "NTSC"; + resX = constrain( confInt["resolutionX"], 320,1920 ); + resY = constrain( confInt["resolutionY"], 240,1200 ); +} + +void GMenu2X::writeConfig() { + ledOn(); + string conffile = path+"gmenu2x.conf"; + ofstream inf(conffile.c_str()); + if (inf.is_open()) { + ConfStrHash::iterator endS = confStr.end(); + for(ConfStrHash::iterator curr = confStr.begin(); curr != endS; curr++) + inf << curr->first << "=\"" << curr->second << "\"" << endl; + + ConfIntHash::iterator endI = confInt.end(); + for(ConfIntHash::iterator curr = confInt.begin(); curr != endI; curr++) + inf << curr->first << "=" << curr->second << endl; + + inf.close(); + sync(); + } + ledOff(); +} + + +void GMenu2X::readConfigOpen2x() { + string conffile = "/etc/config/open2x.conf"; + if (fileExists(conffile)) { + ifstream inf(conffile.c_str(), ios_base::in); + if (inf.is_open()) { + string line; + while (getline(inf, line, '\n')) { + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (name=="USB_NET_ON_BOOT") o2x_usb_net_on_boot = value == "y" ? true : false; + else if (name=="USB_NET_IP") o2x_usb_net_ip = value; + else if (name=="TELNET_ON_BOOT") o2x_telnet_on_boot = value == "y" ? true : false; + else if (name=="FTP_ON_BOOT") o2x_ftp_on_boot = value == "y" ? true : false; + else if (name=="GP2XJOY_ON_BOOT") o2x_gp2xjoy_on_boot = value == "y" ? true : false; + else if (name=="USB_HOST_ON_BOOT") o2x_usb_host_on_boot = value == "y" ? true : false; + else if (name=="USB_HID_ON_BOOT") o2x_usb_hid_on_boot = value == "y" ? true : false; + else if (name=="USB_STORAGE_ON_BOOT") o2x_usb_storage_on_boot = value == "y" ? true : false; + else if (name=="VOLUME_MODE") volumeMode = savedVolumeMode = constrain( atoi(value.c_str()), 0, 2); + else if (name=="PHONES_VALUE") volumeScalerPhones = constrain( atoi(value.c_str()), 0, 100); + else if (name=="NORMAL_VALUE") volumeScalerNormal = constrain( atoi(value.c_str()), 0, 150); + } + inf.close(); + } + } +} +void GMenu2X::writeConfigOpen2x() { + ledOn(); + string conffile = "/etc/config/open2x.conf"; + ofstream inf(conffile.c_str()); + if (inf.is_open()) { + inf << "USB_NET_ON_BOOT=" << ( o2x_usb_net_on_boot ? "y" : "n" ) << endl; + inf << "USB_NET_IP=" << o2x_usb_net_ip << endl; + inf << "TELNET_ON_BOOT=" << ( o2x_telnet_on_boot ? "y" : "n" ) << endl; + inf << "FTP_ON_BOOT=" << ( o2x_ftp_on_boot ? "y" : "n" ) << endl; + inf << "GP2XJOY_ON_BOOT=" << ( o2x_gp2xjoy_on_boot ? "y" : "n" ) << endl; + inf << "USB_HOST_ON_BOOT=" << ( (o2x_usb_host_on_boot || o2x_usb_hid_on_boot || o2x_usb_storage_on_boot) ? "y" : "n" ) << endl; + inf << "USB_HID_ON_BOOT=" << ( o2x_usb_hid_on_boot ? "y" : "n" ) << endl; + inf << "USB_STORAGE_ON_BOOT=" << ( o2x_usb_storage_on_boot ? "y" : "n" ) << endl; + inf << "VOLUME_MODE=" << volumeMode << endl; + if (volumeScalerPhones != VOLUME_SCALER_PHONES) inf << "PHONES_VALUE=" << volumeScalerPhones << endl; + if (volumeScalerNormal != VOLUME_SCALER_NORMAL) inf << "NORMAL_VALUE=" << volumeScalerNormal << endl; + inf.close(); + sync(); + } + ledOff(); +} + +void GMenu2X::writeSkinConfig() { + ledOn(); + string conffile = path+"skins/"+confStr["skin"]+"/skin.conf"; + ofstream inf(conffile.c_str()); + if (inf.is_open()) { + ConfStrHash::iterator endS = skinConfStr.end(); + for(ConfStrHash::iterator curr = skinConfStr.begin(); curr != endS; curr++) + inf << curr->first << "=\"" << curr->second << "\"" << endl; + + ConfIntHash::iterator endI = skinConfInt.end(); + for(ConfIntHash::iterator curr = skinConfInt.begin(); curr != endI; curr++) + inf << curr->first << "=" << curr->second << endl; + + ConfRGBAHash::iterator endC = skinConfColors.end(); + for(ConfRGBAHash::iterator curr = skinConfColors.begin(); curr != endC; curr++) + inf << curr->first << "=#" << hex << curr->second.r << hex << curr->second.g << hex << curr->second.b << hex << curr->second.a << endl; + + inf.close(); + sync(); + } + ledOff(); +} + +void GMenu2X::readCommonIni() { + if (fileExists("/usr/gp2x/common.ini")) { + ifstream inf("/usr/gp2x/common.ini", ios_base::in); + if (inf.is_open()) { + string line; + string section = ""; + while (getline(inf, line, '\n')) { + line = trim(line); + if (line[0]=='[' && line[line.length()-1]==']') { + section = line.substr(1,line.length()-2); + } else { + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (section=="usbnet") { + if (name=="enable") + usbnet = value=="true" ? true : false; + else if (name=="ip") + ip = value; + + } else if (section=="server") { + if (name=="inet") + inet = value=="true" ? true : false; + else if (name=="samba") + samba = value=="true" ? true : false; + else if (name=="web") + web = value=="true" ? true : false; + } + } + } + inf.close(); + } + } +} + +void GMenu2X::writeCommonIni() {} + +void GMenu2X::readTmp() { + lastSelectorElement = -1; + if (fileExists("/tmp/gmenu2x.tmp")) { + ifstream inf("/tmp/gmenu2x.tmp", ios_base::in); + if (inf.is_open()) { + string line; + string section = ""; + while (getline(inf, line, '\n')) { + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (name=="section") + menu->setSectionIndex(atoi(value.c_str())); + else if (name=="link") + menu->setLinkIndex(atoi(value.c_str())); + else if (name=="selectorelem") + lastSelectorElement = atoi(value.c_str()); + else if (name=="selectordir") + lastSelectorDir = value; + } + inf.close(); + } + } +} + +void GMenu2X::writeTmp(int selelem, string selectordir) { + string conffile = "/tmp/gmenu2x.tmp"; + ofstream inf(conffile.c_str()); + if (inf.is_open()) { + inf << "section=" << menu->selSectionIndex() << endl; + inf << "link=" << menu->selLinkIndex() << endl; + if (selelem>-1) + inf << "selectorelem=" << selelem << endl; + if (selectordir!="") + inf << "selectordir=" << selectordir << endl; + inf.close(); + sync(); + } +} + +void GMenu2X::initServices() { +#ifdef TARGET_GP2X +/* if (usbnet) { + string services = "scripts/services.sh "+ip+" "+(inet?"on":"off")+" "+(samba?"on":"off")+" "+(web?"on":"off")+" &"; + system(services.c_str()); + }*/ +#endif +} + +void GMenu2X::ledOn() { +#ifdef TARGET_GP2X +// if (gp2x_mem!=0 && !f200) gp2x_memregs[0x106E >> 1] ^= 16; + //SDL_SYS_JoystickGp2xSys(joy.joystick, BATT_LED_ON); +#endif +} + +void GMenu2X::ledOff() { +#ifdef TARGET_GP2X +// if (gp2x_mem!=0 && !f200) gp2x_memregs[0x106E >> 1] ^= 16; + //SDL_SYS_JoystickGp2xSys(joy.joystick, BATT_LED_OFF); +#endif +} + +void GMenu2X::setBacklight(int val) +{ + if ((val >= 0) && (val <=100)) + { + if (backlightHandle) + { + stringstream valsstr; + string valstr = ""; + if (val < 10) + valsstr << "00"; + else if (val < 100) + valsstr << "0" ; + valsstr << val; + valsstr >> valstr; + fprintf(backlightHandle,"%s",valstr.c_str()); + rewind(backlightHandle); + } + } +} + +int GMenu2X::getBackLight() +{ + int val = 100; + if (backlightHandle) + { + char valcstring[4]; + fscanf(backlightHandle,"%s",&valcstring); + rewind(backlightHandle); + val = atoi(valcstring); + } + return val; +} + +int GMenu2X::main() { + uint linksPerPage = linkColumns*linkRows; + int linkSpacingX = (resX-10 - linkColumns*skinConfInt["linkWidth"])/linkColumns; + int linkSpacingY = (resY-35 - skinConfInt["topBarHeight"] - linkRows*skinConfInt["linkHeight"])/linkRows; + uint sectionLinkPadding = (skinConfInt["topBarHeight"] - 32 - font->getLineHeight()) / 3; + + bool quit = false; + int x,y, offset = menu->sectionLinks()->size()>linksPerPage ? 2 : 6, helpBoxHeight = fwType=="open2x" ? 154 : 139; + uint i; + long tickBattery = -60000, tickNow; + string batteryIcon = "imgs/battery/0.png"; + stringstream ss; + uint sectionsCoordX = 24; + SDL_Rect re = {0,0,0,0}; + bool helpDisplayed = false; +#ifdef DEBUG + //framerate + long tickFPS = SDL_GetTicks(); + int drawn_frames = 0; + string fps = ""; +#endif + + IconButton btnContextMenu(this,"skin:imgs/menu.png"); + btnContextMenu.setPosition(resX-38, bottomBarIconY); + btnContextMenu.setAction(MakeDelegate(this, &GMenu2X::contextMenu)); + + while (!quit) { + tickNow = SDL_GetTicks(); + + //Background + sc["bgmain"]->blit(s,0,0); + + //Sections + sectionsCoordX = halfX - (constrain((uint)menu->sections.size(), 0 , linkColumns) * skinConfInt["linkWidth"]) / 2; + if (menu->firstDispSection()>0) + sc.skinRes("imgs/l_enabled.png")->blit(s,0,0); + else + sc.skinRes("imgs/l_disabled.png")->blit(s,0,0); + if (menu->firstDispSection()+linkColumnssections.size()) + sc.skinRes("imgs/r_enabled.png")->blit(s,resX-10,0); + else + sc.skinRes("imgs/r_disabled.png")->blit(s,resX-10,0); + for (i=menu->firstDispSection(); isections.size() && ifirstDispSection()+linkColumns; i++) { + string sectionIcon = "skin:sections/"+menu->sections[i]+".png"; + x = (i-menu->firstDispSection())*skinConfInt["linkWidth"]+sectionsCoordX; + if (menu->selSectionIndex()==(int)i) + s->box(x, 0, skinConfInt["linkWidth"], skinConfInt["topBarHeight"], skinConfColors["selectionBg"]); + x += skinConfInt["linkWidth"]/2; + if (sc.exists(sectionIcon)) + sc[sectionIcon]->blit(s,x-16,sectionLinkPadding,32,32); + else + sc.skinRes("icons/section.png")->blit(s,x-16,sectionLinkPadding); + s->write( font, menu->sections[i], x, skinConfInt["topBarHeight"]-sectionLinkPadding, SFontHAlignCenter, SFontVAlignBottom ); + } + + //Links + s->setClipRect(offset,skinConfInt["topBarHeight"],resX-9,resY-74); //32*2+10 + for (i=menu->firstDispRow()*linkColumns; i<(menu->firstDispRow()*linkColumns)+linksPerPage && isectionLinks()->size(); i++) { + int ir = i-menu->firstDispRow()*linkColumns; + x = (ir%linkColumns)*(skinConfInt["linkWidth"]+linkSpacingX)+offset; + y = ir/linkColumns*(skinConfInt["linkHeight"]+linkSpacingY)+skinConfInt["topBarHeight"]+2; + menu->sectionLinks()->at(i)->setPosition(x,y); + + if (i==(uint)menu->selLinkIndex()) + menu->sectionLinks()->at(i)->paintHover(); + + menu->sectionLinks()->at(i)->paint(); + } + s->clearClipRect(); + + drawScrollBar(linkRows,menu->sectionLinks()->size()/linkColumns + ((menu->sectionLinks()->size()%linkColumns==0) ? 0 : 1),menu->firstDispRow(),43,resY-81); + + switch(volumeMode) { + case VOLUME_MODE_MUTE: sc.skinRes("imgs/mute.png")->blit(s,279,bottomBarIconY); break; + case VOLUME_MODE_PHONES: sc.skinRes("imgs/phones.png")->blit(s,279,bottomBarIconY); break; + default: sc.skinRes("imgs/volume.png")->blit(s,279,bottomBarIconY); break; + } + + if (menu->selLink()!=NULL) { + s->write ( font, menu->selLink()->getDescription(), halfX, resY-19, SFontHAlignCenter, SFontVAlignBottom ); + if (menu->selLinkApp()!=NULL) { + s->write ( font, menu->selLinkApp()->clockStr(confInt["maxClock"]), cpuX, bottomBarTextY, SFontHAlignLeft, SFontVAlignMiddle ); + s->write ( font, menu->selLinkApp()->volumeStr(), volumeX, bottomBarTextY, SFontHAlignLeft, SFontVAlignMiddle ); + //Manual indicator + if (!menu->selLinkApp()->getManual().empty()) + sc.skinRes("imgs/manual.png")->blit(s,manualX,bottomBarIconY); + } + } + + if (f200) { + btnContextMenu.paint(); + } + //check battery status every 60 seconds + if (tickNow-tickBattery >= 60000) { + tickBattery = tickNow; + unsigned short battlevel = getBatteryLevel(); + if (battlevel>5) { + batteryIcon = "imgs/battery/ac.png"; + } else { + ss.clear(); + ss << battlevel; + ss >> batteryIcon; + batteryIcon = "imgs/battery/"+batteryIcon+".png"; + } + } + sc.skinRes(batteryIcon)->blit( s, resX-19, bottomBarIconY ); + //s->write( font, tr[batstr.c_str()], 20, 170 ); + //On Screen Help + + if(input[ACTION_A] ) + helpDisplayed = ! helpDisplayed; + + if (helpDisplayed) { + s->box(10,50,300,143, skinConfColors["messageBoxBg"]); + s->rectangle( 12,52,296,helpBoxHeight, skinConfColors["messageBoxBorder"] ); + s->write( font, tr["CONTROLS"], 20, 60 ); + s->write( font, tr["B, Stick press: Launch link / Confirm action"], 20, 80 ); + s->write( font, tr["L, R: Change section"], 20, 95 ); + s->write( font, tr["Y: Show manual/readme"], 20, 110 ); + s->write( font, tr["VOLUP, VOLDOWN: Change cpu clock"], 20, 125 ); + s->write( font, tr["A+VOLUP, A+VOLDOWN: Change volume"], 20, 140 ); + s->write( font, tr["SELECT: Show contextual menu"], 20, 155 ); + s->write( font, tr["START: Show options menu"], 20, 170 ); + if (fwType=="open2x") s->write( font, tr["X: Toggle speaker mode"], 20, 185 ); + + } + +#ifdef DEBUG + //framerate + drawn_frames++; + if (tickNow-tickFPS>=1000) { + ss.clear(); + ss << drawn_frames*(tickNow-tickFPS+1)/1000; + ss >> fps; + tickFPS = tickNow; + drawn_frames = 0; + } + s->write( font, fps+" FPS", resX-1,1 ,SFontHAlignRight ); +#endif + + s->flip(); + + //touchscreen + if (f200) { + ts.poll(); + btnContextMenu.handleTS(); + re.x = 0; re.y = 0; re.h = skinConfInt["topBarHeight"]; re.w = resX; + if (ts.pressed() && ts.inRect(re)) { + re.w = skinConfInt["linkWidth"]; + for (i=menu->firstDispSection(); !ts.handled() && isections.size() && ifirstDispSection()+linkColumns; i++) { + sectionsCoordX = halfX - (constrain((uint)(linkColumns-menu->sections.size()), 0 , linkColumns) * skinConfInt["linkWidth"]) / 2; + re.x = (i-menu->firstDispSection())*re.w+sectionsCoordX; + + if (ts.inRect(re)) { + menu->setSectionIndex(i); + ts.setHandled(); + } + } + } + + i=menu->firstDispRow()*linkColumns; + while ( i<(menu->firstDispRow()*linkColumns)+linksPerPage && isectionLinks()->size()) { + if (menu->sectionLinks()->at(i)->isPressed()) + menu->setLinkIndex(i); + if (menu->sectionLinks()->at(i)->handleTS()) + i = menu->sectionLinks()->size(); + i++; + } + } + +//#ifdef TARGET_GP2X + input.update(); + if ( input[ACTION_B] && menu->selLink()!=NULL ) menu->selLink()->run(); + else if ( input[ACTION_START] ) options(); + else if ( input[ACTION_SELECT] ) contextMenu(); + // VOLUME SCALE MODIFIER + else if ( fwType=="open2x" && input[ACTION_X] ) { + volumeMode = constrain(volumeMode-1, -VOLUME_MODE_MUTE-1, VOLUME_MODE_NORMAL); + if(volumeMode < VOLUME_MODE_MUTE) + volumeMode = VOLUME_MODE_NORMAL; + switch(volumeMode) { + case VOLUME_MODE_MUTE: setVolumeScaler(VOLUME_SCALER_MUTE); break; + case VOLUME_MODE_PHONES: setVolumeScaler(volumeScalerPhones); break; + case VOLUME_MODE_NORMAL: setVolumeScaler(volumeScalerNormal); break; + } + setVolume(confInt["globalVolume"]); + } + // LINK NAVIGATION + else if ( input[ACTION_LEFT ] ) menu->linkLeft(); + else if ( input[ACTION_RIGHT] ) menu->linkRight(); + else if ( input[ACTION_UP ] ) menu->linkUp(); + else if ( input[ACTION_DOWN ] ) menu->linkDown(); + // SELLINKAPP SELECTED + else if (menu->selLinkApp()!=NULL) { + if ( input[ACTION_Y] ) menu->selLinkApp()->showManual(); + else if ( input.isActive(ACTION_A) ) { + // VOLUME + if ( input[ACTION_VOLDOWN] && !input.isActive(ACTION_VOLUP) ) + menu->selLinkApp()->setVolume( constrain(menu->selLinkApp()->volume()-1,0,100) ); + if ( input[ACTION_VOLUP] && !input.isActive(ACTION_VOLDOWN) ) + menu->selLinkApp()->setVolume( constrain(menu->selLinkApp()->volume()+1,0,100) );; + if ( input.isActive(ACTION_VOLUP) && input.isActive(ACTION_VOLDOWN) ) menu->selLinkApp()->setVolume(-1); + } else { + // CLOCK + if ( input[ACTION_VOLDOWN] && !input.isActive(ACTION_VOLUP) ) + menu->selLinkApp()->setClock( constrain(menu->selLinkApp()->clock()-1,200,confInt["maxClock"]) ); + if ( input[ACTION_VOLUP] && !input.isActive(ACTION_VOLDOWN) ) + menu->selLinkApp()->setClock( constrain(menu->selLinkApp()->clock()+1,200,confInt["maxClock"]) ); + if ( input.isActive(ACTION_VOLUP) && input.isActive(ACTION_VOLDOWN) ) menu->selLinkApp()->setClock(336); + } + } + if ( input.isActive(ACTION_A) ) { + if (input.isActive(ACTION_L) && input.isActive(ACTION_R)) + saveScreenshot(); + } else { + // SECTIONS + if ( input[ACTION_L ] ) { + menu->decSectionIndex(); + offset = menu->sectionLinks()->size()>linksPerPage ? 2 : 6; + } else if ( input[ACTION_R ] ) { + menu->incSectionIndex(); + offset = menu->sectionLinks()->size()>linksPerPage ? 2 : 6; + } + } + + usleep(LOOP_DELAY); + } + + return -1; +} + +void GMenu2X::explorer() { + FileDialog fd(this,tr["Select an application"],".gpu,.dge,.sh"); + if (fd.exec()) { + if (confInt["saveSelection"] && (confInt["section"]!=menu->selSectionIndex() || confInt["link"]!=menu->selLinkIndex())) + writeConfig(); + if (fwType == "open2x" && savedVolumeMode != volumeMode) + writeConfigOpen2x(); + + //string command = cmdclean(fd.path()+"/"+fd.file) + "; sync & cd "+cmdclean(getExePath())+"; exec ./gmenu2x"; + string command = cmdclean(fd.path()+"/"+fd.file); + chdir(fd.path().c_str()); + quit(); + setClock(200); + execlp("/bin/sh","/bin/sh","-c",command.c_str(),NULL); + + //if execution continues then something went wrong and as we already called SDL_Quit we cannot continue + //try relaunching gmenu2x + fprintf(stderr, "Error executing selected application, re-launching gmenu2x\n"); + chdir(getExePath().c_str()); + execlp("./gmenu2x", "./gmenu2x", NULL); + } +} + +void GMenu2X::options() { + int curMenuClock = confInt["menuClock"]; + int curGlobalVolume = confInt["globalVolume"]; + //G + int prevbacklight = confInt["backlight"]; + bool showRootFolder = fileExists("/card"); + + FileLister fl_tr("translations"); + fl_tr.browse(); + fl_tr.files.insert(fl_tr.files.begin(),"English"); + string lang = tr.lang(); + + vector encodings; + encodings.push_back("NTSC"); + encodings.push_back("PAL"); + + SettingsDialog sd(this,tr["Settings"]); + sd.addSetting(new MenuSettingMultiString(this,tr["Language"],tr["Set the language used by GMenu2X"],&lang,&fl_tr.files)); + sd.addSetting(new MenuSettingBool(this,tr["Save last selection"],tr["Save the last selected link and section on exit"],&confInt["saveSelection"])); + sd.addSetting(new MenuSettingInt(this,tr["Clock for GMenu2X"],tr["Set the cpu working frequency when running GMenu2X"],&confInt["menuClock"],200,430)); + sd.addSetting(new MenuSettingInt(this,tr["Maximum overclock"],tr["Set the maximum overclock for launching links"],&confInt["maxClock"],200,430)); + sd.addSetting(new MenuSettingInt(this,tr["Global Volume"],tr["Set the default volume for the gp2x soundcard"],&confInt["globalVolume"],0,100)); + sd.addSetting(new MenuSettingBool(this,tr["Output logs"],tr["Logs the output of the links. Use the Log Viewer to read them."],&confInt["outputLogs"])); + //G + sd.addSetting(new MenuSettingInt(this,tr["Lcd Backlight"],tr["Set dingoo's Lcd Backlight value (default: 100)"],&confInt["backlight"],5,100)); +// sd.addSetting(new MenuSettingMultiString(this,tr["Tv-Out encoding"],tr["Encoding of the tv-out signal"],&confStr["tvoutEncoding"],&encodings)); + sd.addSetting(new MenuSettingBool(this,tr["Show root"],tr["Show root folder in the file selection dialogs"],&showRootFolder)); + + if (sd.exec() && sd.edited()) { + //G + if (prevbacklight != confInt["backlight"]) setBacklight(confInt["backlight"]); + if (curMenuClock!=confInt["menuClock"]) setClock(confInt["menuClock"]); + if (curGlobalVolume!=confInt["globalVolume"]) setVolume(confInt["globalVolume"]); + if (lang == "English") lang = ""; + if (lang != tr.lang()) tr.setLang(lang); + if (fileExists("/card") && !showRootFolder) + unlink("/card"); + else if (!fileExists("/card") && showRootFolder) + symlink("/","/card"); + writeConfig(); + } +} + +void GMenu2X::settingsOpen2x() { + SettingsDialog sd(this,tr["Open2x Settings"]); + sd.addSetting(new MenuSettingBool(this,tr["USB net on boot"],tr["Allow USB networking to be started at boot time"],&o2x_usb_net_on_boot)); + sd.addSetting(new MenuSettingString(this,tr["USB net IP"],tr["IP address to be used for USB networking"],&o2x_usb_net_ip)); + sd.addSetting(new MenuSettingBool(this,tr["Telnet on boot"],tr["Allow telnet to be started at boot time"],&o2x_telnet_on_boot)); + sd.addSetting(new MenuSettingBool(this,tr["FTP on boot"],tr["Allow FTP to be started at boot time"],&o2x_ftp_on_boot)); + sd.addSetting(new MenuSettingBool(this,tr["GP2XJOY on boot"],tr["Create a js0 device for GP2X controls"],&o2x_gp2xjoy_on_boot)); + sd.addSetting(new MenuSettingBool(this,tr["USB host on boot"],tr["Allow USB host to be started at boot time"],&o2x_usb_host_on_boot)); + sd.addSetting(new MenuSettingBool(this,tr["USB HID on boot"],tr["Allow USB HID to be started at boot time"],&o2x_usb_hid_on_boot)); + sd.addSetting(new MenuSettingBool(this,tr["USB storage on boot"],tr["Allow USB storage to be started at boot time"],&o2x_usb_storage_on_boot)); + //sd.addSetting(new MenuSettingInt(this,tr["Speaker Mode on boot"],tr["Set Speaker mode. 0 = Mute, 1 = Phones, 2 = Speaker"],&volumeMode,0,2)); + sd.addSetting(new MenuSettingInt(this,tr["Speaker Scaler"],tr["Set the Speaker Mode scaling 0-150\% (default is 100\%)"],&volumeScalerNormal,0,150)); + sd.addSetting(new MenuSettingInt(this,tr["Headphones Scaler"],tr["Set the Headphones Mode scaling 0-100\% (default is 65\%)"],&volumeScalerPhones,0,100)); + + if (sd.exec() && sd.edited()) { + writeConfigOpen2x(); + switch(volumeMode) { + case VOLUME_MODE_MUTE: setVolumeScaler(VOLUME_SCALER_MUTE); break; + case VOLUME_MODE_PHONES: setVolumeScaler(volumeScalerPhones); break; + case VOLUME_MODE_NORMAL: setVolumeScaler(volumeScalerNormal); break; + } + setVolume(confInt["globalVolume"]); + } +} + +void GMenu2X::skinMenu() { + FileLister fl_sk("skins",true,false); + fl_sk.exclude.push_back(".."); + fl_sk.browse(); + string curSkin = confStr["skin"]; + + SettingsDialog sd(this,tr["Skin"]); + sd.addSetting(new MenuSettingMultiString(this,tr["Skin"],tr["Set the skin used by GMenu2X"],&confStr["skin"],&fl_sk.directories)); + sd.addSetting(new MenuSettingRGBA(this,tr["Top Bar Color"],tr["Color of the top bar"],&skinConfColors["topBarBg"])); + sd.addSetting(new MenuSettingRGBA(this,tr["Bottom Bar Color"],tr["Color of the bottom bar"],&skinConfColors["bottomBarBg"])); + sd.addSetting(new MenuSettingRGBA(this,tr["Selection Color"],tr["Color of the selection and other interface details"],&skinConfColors["selectionBg"])); + sd.addSetting(new MenuSettingRGBA(this,tr["Message Box Color"],tr["Background color of the message box"],&skinConfColors["messageBoxBg"])); + sd.addSetting(new MenuSettingRGBA(this,tr["Message Box Border Color"],tr["Border color of the message box"],&skinConfColors["messageBoxBorder"])); + sd.addSetting(new MenuSettingRGBA(this,tr["Message Box Selection Color"],tr["Color of the selection of the message box"],&skinConfColors["messageBoxSelection"])); + + if (sd.exec() && sd.edited()) { + if (curSkin != confStr["skin"]) { + setSkin(confStr["skin"]); + writeConfig(); + } + writeSkinConfig(); + initBG(); + } +} + +void GMenu2X::toggleTvOut() { +#ifdef TARGET_GP2X +/* if (cx25874!=0) + gp2x_tvout_off(); + else + gp2x_tvout_on(confStr["tvoutEncoding"] == "PAL");*/ +#endif +} + +void GMenu2X::setSkin(string skin, bool setWallpaper) { + confStr["skin"] = skin; + + //Clear previous skin settings + skinConfColors.clear(); + skinConfStr.clear(); + skinConfInt.clear(); + + //clear collection and change the skin path + sc.clear(); + sc.setSkin(skin); + + //reset colors to the default values + skinConfColors["topBarBg"] = (RGBAColor){255,255,255,130}; + skinConfColors["bottomBarBg"] = (RGBAColor){255,255,255,130}; + skinConfColors["selectionBg"] = (RGBAColor){255,255,255,130}; + skinConfColors["messageBoxBg"] = (RGBAColor){255,255,255,255}; + skinConfColors["messageBoxBorder"] = (RGBAColor){80,80,80,255}; + skinConfColors["messageBoxSelection"] = (RGBAColor){160,160,160,255}; + + //load skin settings + string skinconfname = "skins/"+skin+"/skin.conf"; + if (fileExists(skinconfname)) { + ifstream skinconf(skinconfname.c_str(), ios_base::in); + if (skinconf.is_open()) { + string line; + while (getline(skinconf, line, '\n')) { + line = trim(line); + cout << "skinconf: " << line << endl; + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (value.length()>0) { + if (value.length()>1 && value.at(0)=='"' && value.at(value.length()-1)=='"') + skinConfStr[name] = value.substr(1,value.length()-2); + else if (value.at(0) == '#') + skinConfColors[name] = strtorgba( value.substr(1,value.length()) ); + else + skinConfInt[name] = atoi(value.c_str()); + } + } + skinconf.close(); + + if (setWallpaper && !skinConfStr["wallpaper"].empty() && fileExists("skins/"+skin+"/wallpapers/"+skinConfStr["wallpaper"])) + confStr["wallpaper"] = "skins/"+skin+"/wallpapers/"+skinConfStr["wallpaper"]; + } + } + + evalIntConf( &skinConfInt["topBarHeight"], 40, 32,120 ); + evalIntConf( &skinConfInt["linkHeight"], 40, 32,120 ); + evalIntConf( &skinConfInt["linkWidth"], 60, 32,120 ); + + //recalculate some coordinates based on the new element sizes + linkColumns = (resX-10)/skinConfInt["linkWidth"]; + linkRows = (resY-35-skinConfInt["topBarHeight"])/skinConfInt["linkHeight"]; + + if (menu != NULL) menu->loadIcons(); + + //Selection png + useSelectionPng = sc.addSkinRes("imgs/selection.png") != NULL; + + //font + initFont(); +} + +void GMenu2X::activateSdUsb() { + if (usbnet) { + MessageBox mb(this,tr["Operation not permitted."]+"\n"+tr["You should disable Usb Networking to do this."]); + mb.exec(); + } else { + system("scripts/usbon.sh sd"); + MessageBox mb(this,tr["USB Enabled (SD)"],"icons/usb.png"); + mb.buttons[ACTION_B] = tr["Turn off"]; + mb.exec(); + system("scripts/usboff.sh sd"); + } +} + +void GMenu2X::activateNandUsb() { + if (usbnet) { + MessageBox mb(this,tr["Operation not permitted."]+"\n"+tr["You should disable Usb Networking to do this."]); + mb.exec(); + } else { + system("scripts/usbon.sh nand"); + MessageBox mb(this,tr["USB Enabled (Nand)"],"icons/usb.png"); + mb.buttons[ACTION_B] = tr["Turn off"]; + mb.exec(); + system("scripts/usboff.sh nand"); + } +} + +void GMenu2X::activateRootUsb() { + if (usbnet) { + MessageBox mb(this,tr["Operation not permitted."]+"\n"+tr["You should disable Usb Networking to do this."]); + mb.exec(); + } else { + system("scripts/usbon.sh root"); + MessageBox mb(this,tr["USB Enabled (Root)"],"icons/usb.png"); + mb.buttons[ACTION_B] = tr["Turn off"]; + mb.exec(); + system("scripts/usboff.sh root"); + } +} + +void GMenu2X::contextMenu() { + vector voices; + { + MenuOption opt = {tr.translate("Add link in $1",menu->selSection().c_str(),NULL), MakeDelegate(this, &GMenu2X::addLink)}; + voices.push_back(opt); + } + + if (menu->selLinkApp()!=NULL) { + { + MenuOption opt = {tr.translate("Edit $1",menu->selLink()->getTitle().c_str(),NULL), MakeDelegate(this, &GMenu2X::editLink)}; + voices.push_back(opt); + }{ + MenuOption opt = {tr.translate("Delete $1 link",menu->selLink()->getTitle().c_str(),NULL), MakeDelegate(this, &GMenu2X::deleteLink)}; + voices.push_back(opt); + } + } + + { + MenuOption opt = {tr["Add section"], MakeDelegate(this, &GMenu2X::addSection)}; + voices.push_back(opt); + }{ + MenuOption opt = {tr["Rename section"], MakeDelegate(this, &GMenu2X::renameSection)}; + voices.push_back(opt); + }{ + MenuOption opt = {tr["Delete section"], MakeDelegate(this, &GMenu2X::deleteSection)}; + voices.push_back(opt); + }{ + MenuOption opt = {tr["Scan for applications and games"], MakeDelegate(this, &GMenu2X::scanner)}; + voices.push_back(opt); + } + + bool close = false; + uint i, sel=0, fadeAlpha=0; + + int h = font->getHeight(); + int h2 = font->getHalfHeight(); + SDL_Rect box; + box.h = (h+2)*voices.size()+8; + box.w = 0; + for (i=0; igetTextWidth(voices[i].text); + if (w>box.w) box.w = w; + } + box.w += 23; + box.x = halfX - box.w/2; + box.y = halfY - box.h/2; + + SDL_Rect selbox = {box.x+4, 0, box.w-8, h+2}; + long tickNow, tickStart = SDL_GetTicks(); + + Surface bg(s); + /*//Darken background + bg.box(0, 0, resX, resY, 0,0,0,150); + bg.box(box.x, box.y, box.w, box.h, skinConfColors["messageBoxBg"]); + bg.rectangle( box.x+2, box.y+2, box.w-4, box.h-4, skinConfColors["messageBoxBorder"] );*/ + while (!close) { + tickNow = SDL_GetTicks(); + + selbox.y = box.y+4+(h+2)*sel; + bg.blit(s,0,0); + + if (fadeAlpha<200) fadeAlpha = intTransition(0,200,tickStart,500,tickNow); + s->box(0, 0, resX, resY, 0,0,0,fadeAlpha); + s->box(box.x, box.y, box.w, box.h, skinConfColors["messageBoxBg"]); + s->rectangle( box.x+2, box.y+2, box.w-4, box.h-4, skinConfColors["messageBoxBorder"] ); + + + //draw selection rect + s->box( selbox.x, selbox.y, selbox.w, selbox.h, skinConfColors["messageBoxSelection"] ); + for (i=0; iwrite( font, voices[i].text, box.x+12, box.y+h2+5+(h+2)*i, SFontHAlignLeft, SFontVAlignMiddle ); + s->flip(); + + //touchscreen + if (f200) { + ts.poll(); + if (ts.released()) { + if (!ts.inRect(box)) + close = true; + else if (ts.x>=selbox.x && ts.x<=selbox.x+selbox.w) + for (i=0; i=selbox.y && ts.y<=selbox.y+selbox.h) { + voices[i].action(); + close = true; + i = voices.size(); + } + } + } else if (ts.pressed() && ts.inRect(box)) { + for (i=0; i=selbox.y && ts.y<=selbox.y+selbox.h) { + sel = i; + i = voices.size(); + } + } + } + } + + input.update(); + if ( input[ACTION_SELECT] ) close = true; + if ( input[ACTION_UP ] ) sel = max(0, sel-1); + if ( input[ACTION_DOWN ] ) sel = min((int)voices.size()-1, sel+1); + if ( input[ACTION_B] ) { voices[sel].action(); close = true; } + } +} + +void GMenu2X::changeWallpaper() { + WallpaperDialog wp(this); + if (wp.exec() && confStr["wallpaper"] != wp.wallpaper) { + confStr["wallpaper"] = wp.wallpaper; + initBG(); + writeConfig(); + } +} + +void GMenu2X::saveScreenshot() { + ledOn(); + uint x = 0; + stringstream ss; + string fname; + do { + x++; + fname = ""; + ss.clear(); + ss << x; + ss >> fname; + fname = "screen"+fname+".bmp"; + } while (fileExists(fname)); + SDL_SaveBMP(s->raw,fname.c_str()); + sync(); + ledOff(); +} + +void GMenu2X::addLink() { + FileDialog fd(this,tr["Select an application"]); + if (fd.exec()) { + ledOn(); + menu->addLink(fd.path(), fd.file); + sync(); + ledOff(); + } +} + +void GMenu2X::editLink() { + if (menu->selLinkApp()==NULL) return; + + vector pathV; + split(pathV,menu->selLinkApp()->file,"/"); + string oldSection = ""; + if (pathV.size()>1) + oldSection = pathV[pathV.size()-2]; + string newSection = oldSection; + + string linkTitle = menu->selLinkApp()->getTitle(); + string linkDescription = menu->selLinkApp()->getDescription(); + string linkIcon = menu->selLinkApp()->getIcon(); + string linkManual = menu->selLinkApp()->getManual(); + string linkParams = menu->selLinkApp()->getParams(); + string linkSelFilter = menu->selLinkApp()->getSelectorFilter(); + string linkSelDir = menu->selLinkApp()->getSelectorDir(); + bool linkSelBrowser = menu->selLinkApp()->getSelectorBrowser(); + bool linkUseRamTimings = menu->selLinkApp()->getUseRamTimings(); + string linkSelScreens = menu->selLinkApp()->getSelectorScreens(); + string linkSelAliases = menu->selLinkApp()->getAliasFile(); + int linkClock = menu->selLinkApp()->clock(); + int linkVolume = menu->selLinkApp()->volume(); + //G + int linkGamma = menu->selLinkApp()->gamma(); + int linkBacklight = menu->selLinkApp()->backlight(); + + string diagTitle = tr.translate("Edit link: $1",linkTitle.c_str(),NULL); + string diagIcon = menu->selLinkApp()->getIconPath(); + + SettingsDialog sd(this,diagTitle,diagIcon); + sd.addSetting(new MenuSettingString(this,tr["Title"],tr["Link title"],&linkTitle, diagTitle,diagIcon)); + sd.addSetting(new MenuSettingString(this,tr["Description"],tr["Link description"],&linkDescription, diagTitle,diagIcon)); + sd.addSetting(new MenuSettingMultiString(this,tr["Section"],tr["The section this link belongs to"],&newSection,&menu->sections)); + sd.addSetting(new MenuSettingImage(this,tr["Icon"],tr.translate("Select an icon for the link: $1",linkTitle.c_str(),NULL),&linkIcon,".png,.bmp,.jpg,.jpeg")); + sd.addSetting(new MenuSettingFile(this,tr["Manual"],tr["Select a graphic/textual manual or a readme"],&linkManual,".man.png,.txt")); + sd.addSetting(new MenuSettingInt(this,tr["Clock (default: 336)"],tr["Cpu clock frequency to set when launching this link"],&linkClock,200,confInt["maxClock"])); +// sd.addSetting(new MenuSettingBool(this,tr["Tweak RAM Timings"],tr["This usually speeds up the application at the cost of stability"],&linkUseRamTimings)); + sd.addSetting(new MenuSettingInt(this,tr["Volume (default: -1)"],tr["Volume to set for this link"],&linkVolume,-1,100)); + sd.addSetting(new MenuSettingInt(this,tr["Backlight (default: 100)"],tr["LCD backlight value to set when launching this link"],&linkBacklight,5,100)); + sd.addSetting(new MenuSettingString(this,tr["Parameters"],tr["Parameters to pass to the application"],&linkParams, diagTitle,diagIcon)); + sd.addSetting(new MenuSettingDir(this,tr["Selector Directory"],tr["Directory to scan for the selector"],&linkSelDir)); + sd.addSetting(new MenuSettingBool(this,tr["Selector Browser"],tr["Allow the selector to change directory"],&linkSelBrowser)); + sd.addSetting(new MenuSettingString(this,tr["Selector Filter"],tr["Filter for the selector (Separate values with a comma)"],&linkSelFilter, diagTitle,diagIcon)); + sd.addSetting(new MenuSettingDir(this,tr["Selector Screenshots"],tr["Directory of the screenshots for the selector"],&linkSelScreens)); + sd.addSetting(new MenuSettingFile(this,tr["Selector Aliases"],tr["File containing a list of aliases for the selector"],&linkSelAliases)); + //G + sd.addSetting(new MenuSettingBool(this,tr["Wrapper"],tr["Explicitly relaunch GMenu2X after this link's execution ends"],&menu->selLinkApp()->wrapper)); + sd.addSetting(new MenuSettingBool(this,tr["Don't Leave"],tr["Don't quit GMenu2X when launching this link"],&menu->selLinkApp()->dontleave)); + + if (sd.exec() && sd.edited()) { + ledOn(); + + menu->selLinkApp()->setTitle(linkTitle); + menu->selLinkApp()->setDescription(linkDescription); + menu->selLinkApp()->setIcon(linkIcon); + menu->selLinkApp()->setManual(linkManual); + menu->selLinkApp()->setParams(linkParams); + menu->selLinkApp()->setSelectorFilter(linkSelFilter); + menu->selLinkApp()->setSelectorDir(linkSelDir); + menu->selLinkApp()->setSelectorBrowser(linkSelBrowser); + menu->selLinkApp()->setUseRamTimings(linkUseRamTimings); + menu->selLinkApp()->setSelectorScreens(linkSelScreens); + menu->selLinkApp()->setAliasFile(linkSelAliases); + menu->selLinkApp()->setClock(linkClock); + menu->selLinkApp()->setVolume(linkVolume); + //G + menu->selLinkApp()->setBacklight(linkBacklight); + +#ifdef DEBUG + cout << "New Section: " << newSection << endl; +#endif + //if section changed move file and update link->file + if (oldSection!=newSection) { + vector::iterator newSectionIndex = find(menu->sections.begin(),menu->sections.end(),newSection); + if (newSectionIndex==menu->sections.end()) return; + string newFileName = "sections/"+newSection+"/"+linkTitle; + uint x=2; + while (fileExists(newFileName)) { + string id = ""; + stringstream ss; ss << x; ss >> id; + newFileName = "sections/"+newSection+"/"+linkTitle+id; + x++; + } + rename(menu->selLinkApp()->file.c_str(),newFileName.c_str()); + menu->selLinkApp()->file = newFileName; +#ifdef DEBUG + cout << "New section index: " << newSectionIndex - menu->sections.begin() << endl; +#endif + menu->linkChangeSection(menu->selLinkIndex(), menu->selSectionIndex(), newSectionIndex - menu->sections.begin()); + } + menu->selLinkApp()->save(); + sync(); + + ledOff(); + } +} + +void GMenu2X::deleteLink() { + if (menu->selLinkApp()!=NULL) { + MessageBox mb(this, tr.translate("Deleting $1",menu->selLink()->getTitle().c_str(),NULL)+"\n"+tr["Are you sure?"], menu->selLink()->getIconPath()); + mb.buttons[ACTION_B] = tr["Yes"]; + mb.buttons[ACTION_X] = tr["No"]; + if (mb.exec() == ACTION_B) { + ledOn(); + menu->deleteSelectedLink(); + sync(); + ledOff(); + } + } +} + +void GMenu2X::addSection() { + InputDialog id(this,tr["Insert a name for the new section"]); + if (id.exec()) { + //only if a section with the same name does not exist + if (find(menu->sections.begin(),menu->sections.end(),id.input)==menu->sections.end()) { + //section directory doesn't exists + ledOn(); + if (menu->addSection(id.input)) { + menu->setSectionIndex( menu->sections.size()-1 ); //switch to the new section + sync(); + } + ledOff(); + } + } +} + +void GMenu2X::renameSection() { + InputDialog id(this,tr["Insert a new name for this section"],menu->selSection()); + if (id.exec()) { + //only if a section with the same name does not exist & !samename + if (menu->selSection()!=id.input && find(menu->sections.begin(),menu->sections.end(),id.input)==menu->sections.end()) { + //section directory doesn't exists + string newsectiondir = "sections/"+id.input; + string sectiondir = "sections/"+menu->selSection(); + ledOn(); + if (rename(sectiondir.c_str(), "tmpsection")==0 && rename("tmpsection", newsectiondir.c_str())==0) { + string oldpng = sectiondir+".png", newpng = newsectiondir+".png"; + string oldicon = sc.getSkinFilePath(oldpng), newicon = sc.getSkinFilePath(newpng); + if (!oldicon.empty() && newicon.empty()) { + newicon = oldicon; + newicon.replace(newicon.find(oldpng), oldpng.length(), newpng); + + if (!fileExists(newicon)) { + rename(oldicon.c_str(), "tmpsectionicon"); + rename("tmpsectionicon", newicon.c_str()); + sc.move("skin:"+oldpng, "skin:"+newpng); + } + } + menu->sections[menu->selSectionIndex()] = id.input; + sync(); + } + ledOff(); + } + } +} + +void GMenu2X::deleteSection() { + MessageBox mb(this,tr["You will lose all the links in this section."]+"\n"+tr["Are you sure?"]); + mb.buttons[ACTION_B] = tr["Yes"]; + mb.buttons[ACTION_X] = tr["No"]; + if (mb.exec() == ACTION_B) { + ledOn(); + if (rmtree(path+"sections/"+menu->selSection())) { + menu->deleteSelectedSection(); + sync(); + } + ledOff(); + } +} + +void GMenu2X::scanner() { + Surface scanbg(bg); + drawButton(&scanbg, "x", tr["Exit"], + drawButton(&scanbg, "b", "", 5)-10); + scanbg.write(font,tr["Link Scanner"],halfX,7,SFontHAlignCenter,SFontVAlignMiddle); + + uint lineY = 42; + +#ifdef _TARGET_PANDORA + //char *configpath = pnd_conf_query_searchpath(); +#else + if (confInt["menuClock"]<430) { + setClock(336); + scanbg.write(font,tr["Raising cpu clock to 336Mhz"],5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + } + + scanbg.write(font,tr["Scanning SD filesystem..."],5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + + vector files; + scanPath("/card",&files); + + //Onyl gph firmware has nand +/* if (fwType=="gph" && !f200) { + scanbg.write(font,tr["Scanning NAND filesystem..."],5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + scanPath("/boot/local/nand",&files); + } +*/ + stringstream ss; + ss << files.size(); + string str = ""; + ss >> str; + scanbg.write(font,tr.translate("$1 files found.",str.c_str(),NULL),5,lineY); + lineY += 26; + scanbg.write(font,tr["Creating links..."],5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + + string path, file; + string::size_type pos; + uint linkCount = 0; + + ledOn(); + for (uint i = 0; i0) { + path = files[i].substr(0, pos+1); + file = files[i].substr(pos+1, files[i].length()); + if (menu->addLink(path,file,"found "+file.substr(file.length()-3,3))) + linkCount++; + } + } + + ss.clear(); + ss << linkCount; + ss >> str; + scanbg.write(font,tr.translate("$1 links created.",str.c_str(),NULL),5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + + if (confInt["menuClock"]<430) { + setClock(confInt["menuClock"]); + scanbg.write(font,tr["Decreasing cpu clock"],5,lineY); + scanbg.blit(s,0,0); + s->flip(); + lineY += 26; + } + + sync(); + ledOff(); +#endif + + bool close = false; + while (!close) { + input.update(); + if (input[ACTION_START] || input[ACTION_B] || input[ACTION_X]) close = true; + usleep(30000); + } +} + +void GMenu2X::scanPath(string path, vector *files) { + DIR *dirp; + struct stat st; + struct dirent *dptr; + string filepath, ext; + + if (path[path.length()-1]!='/') path += "/"; + if ((dirp = opendir(path.c_str())) == NULL) return; + + while ((dptr = readdir(dirp))) { + if (dptr->d_name[0]=='.') + continue; + filepath = path+dptr->d_name; + int statRet = stat(filepath.c_str(), &st); + if (S_ISDIR(st.st_mode)) + scanPath(filepath, files); + if (statRet != -1) { + ext = filepath.substr(filepath.length()-4,4); +#ifdef TARGET_GP2X + if (ext==".gpu" || ext==".dge") +#else + if (ext==".pxml") +#endif + files->push_back(filepath); + } + } + + closedir(dirp); +} + +unsigned short GMenu2X::getBatteryLevel() { +#ifdef TARGET_GP2X +/* if (batteryHandle<=0) return 0; + + if (f200) { + MMSP2ADC val; + read(batteryHandle, &val, sizeof(MMSP2ADC)); + + if (val.batt==0) return 5; + if (val.batt==1) return 3; + if (val.batt==2) return 1; + if (val.batt==3) return 0; + } else { + int battval = 0; + unsigned short cbv, min=900, max=0; + + for (int i = 0; i < BATTERY_READS; i ++) { + if ( read(batteryHandle, &cbv, 2) == 2) { + battval += cbv; + if (cbv>max) max = cbv; + if (cbv=850) return 6; + if (battval>780) return 5; + if (battval>740) return 4; + if (battval>700) return 3; + if (battval>690) return 2; + if (battval>680) return 1; + }*/ + if (!batteryHandle) return 0; + int battval = 0; + char battvalcstr[5]; + fscanf(batteryHandle,"%s",&battvalcstr); + rewind(batteryHandle); + battval = atoi(battvalcstr); + if (battval>90) return 5; + if (battval>70) return 4; + if (battval>50) return 3; + if (battval>30) return 2; + if (battval>10) return 1; + + if (!usbHandle) return 0; + int usbval = 0; + char usbvalcstr[5]; + fscanf(usbHandle,"%s",&usbvalcstr); + rewind(usbHandle); + usbval = atoi(usbvalcstr); + if (usbval==1) return 6; + + return 0; +//#else +// return 6; //AC Power +#endif +} + +void GMenu2X::setInputSpeed() { + input.setInterval(150); + input.setInterval(30, ACTION_VOLDOWN); + input.setInterval(30, ACTION_VOLUP ); + input.setInterval(30, ACTION_A ); + input.setInterval(500, ACTION_START ); + input.setInterval(500, ACTION_SELECT ); + input.setInterval(300, ACTION_X ); + input.setInterval(300, ACTION_Y ); + input.setInterval(1000,ACTION_B ); + //joy.setInterval(1000,ACTION_CLICK ); + input.setInterval(300, ACTION_L ); + input.setInterval(300, ACTION_R ); + SDL_EnableKeyRepeat(1,150); +} + +void GMenu2X::applyRamTimings() { +#ifdef TARGET_GP2X + // 6 4 1 1 1 2 2 +/* if (gp2x_mem!=0) { + int tRC = 5, tRAS = 3, tWR = 0, tMRD = 0, tRFC = 0, tRP = 1, tRCD = 1; + gp2x_memregs[0x3802>>1] = ((tMRD & 0xF) << 12) | ((tRFC & 0xF) << 8) | ((tRP & 0xF) << 4) | (tRCD & 0xF); + gp2x_memregs[0x3804>>1] = ((tRC & 0xF) << 8) | ((tRAS & 0xF) << 4) | (tWR & 0xF); + }*/ +#endif +} + +void GMenu2X::applyDefaultTimings() { +#ifdef TARGET_GP2X + // 8 16 3 8 8 8 8 +/* if (gp2x_mem!=0) { + int tRC = 7, tRAS = 15, tWR = 2, tMRD = 7, tRFC = 7, tRP = 7, tRCD = 7; + gp2x_memregs[0x3802>>1] = ((tMRD & 0xF) << 12) | ((tRFC & 0xF) << 8) | ((tRP & 0xF) << 4) | (tRCD & 0xF); + gp2x_memregs[0x3804>>1] = ((tRC & 0xF) << 8) | ((tRAS & 0xF) << 4) | (tWR & 0xF); + }*/ +#endif +} + + + +void GMenu2X::setClock(unsigned mhz) { + mhz = constrain(mhz,200,confInt["maxClock"]); +#ifdef TARGET_GP2X +/* if (gp2x_mem!=0) { + unsigned v; + unsigned mdiv,pdiv=3,scale=0; + mhz*=1000000; + mdiv=(mhz*pdiv)/GP2X_CLK_FREQ; + mdiv=((mdiv-8)<<8) & 0xff00; + pdiv=((pdiv-2)<<2) & 0xfc; + scale&=3; + v=mdiv | pdiv | scale; + MEM_REG[0x910>>1]=v; + }*/ + jz_cpuspeed(mhz); +#endif +} + +void GMenu2X::setGamma(int gamma) { +#ifdef TARGET_GP2X +/* float fgamma = (float)constrain(gamma,1,100)/10; + fgamma = 1 / fgamma; + MEM_REG[0x2880>>1]&=~(1<<12); + MEM_REG[0x295C>>1]=0; + + for (int i=0; i<256; i++) { + unsigned char g = (unsigned char)(255.0*pow(i/255.0,fgamma)); + unsigned short s = (g<<8) | g; + MEM_REG[0x295E>>1]= s; + MEM_REG[0x295E>>1]= g; + }*/ +#endif +} + +int GMenu2X::getVolume() { + unsigned long mixer; + int basevolume = -1; + mixer = open("/dev/mixer", O_RDONLY); + if(mixer) + { + if (ioctl(mixer, SOUND_MIXER_READ_VOLUME, &basevolume) == -1) { + fprintf(stderr, "Failed opening mixer for read - VOLUME\n"); + } + close(mixer); + if(basevolume != -1) + return (basevolume>>8) & basevolume ; + } + return basevolume; +} + +void GMenu2X::setVolume(int vol) { + unsigned long mixer; + int newvolume = vol; + int oss_volume = newvolume | (newvolume << 8); // set volume for both channels + mixer = open("/dev/mixer", O_WRONLY); + if(mixer) + { + if (ioctl(mixer, SOUND_MIXER_WRITE_VOLUME, &oss_volume) == -1) { + fprintf(stderr, "Failed opening mixer for write - VOLUME\n"); + } + close(mixer); + } + +} + +void GMenu2X::setVolumeScaler(int scale) { + scale = constrain(scale,0,MAX_VOLUME_SCALE_FACTOR); + unsigned long soundDev = open("/dev/mixer", O_WRONLY); + if (soundDev) { + ioctl(soundDev, SOUND_MIXER_PRIVATE2, &scale); + close(soundDev); + } +} + +int GMenu2X::getVolumeScaler() { + int currentscalefactor = -1; + unsigned long soundDev = open("/dev/mixer", O_RDONLY); + if (soundDev) { + ioctl(soundDev, SOUND_MIXER_PRIVATE1, ¤tscalefactor); + close(soundDev); + } + return currentscalefactor; +} + +string GMenu2X::getExePath() { + if (path.empty()) { + char buf[255]; + int l = readlink("/proc/self/exe",buf,255); + + path = buf; + path = path.substr(0,l); + l = path.rfind("/"); + path = path.substr(0,l+1); + } + return path; +} + +string GMenu2X::getDiskFree() { + stringstream ss; + string df = ""; + struct statvfs b; + +// int ret = statvfs("/card/gmenu2x", &b); + int ret = statvfs("/home/vegyraupe/work/qi/NanoNote/Ben/sw/gmenu2x/pandora/gmenu2x", &b); + if (ret==0) { + /*unsigned long free = b.f_bfree*b.f_frsize/1048576; + unsigned long total = b.f_blocks*b.f_frsize/1048576; + ss << free << "/" << total << "MB";*/ + double free = (double)b.f_bfree * (double)b.f_bsize / 1048576.0; + double total = (double)b.f_blocks * (double)b.f_frsize / 1048576.0; + ss << (unsigned long)free << "/" << (unsigned long)total << "MB"; + ss >> df; + } else cout << "\033[0;34mGMENU2X:\033[0;31m statvfs failed with error '" << strerror(errno) << "'\033[0m" << endl; + return df; +} + +int GMenu2X::drawButton(IconButton *btn, int x, int y) { + if (y<0) y = resY+y; + btn->setPosition(x, y-7); + btn->paint(); + return x+btn->getRect().w+6; +} + +int GMenu2X::drawButton(Surface *s, string btn, string text, int x, int y) { + if (y<0) y = resY+y; + SDL_Rect re = {x, y-7, 0, 16}; + if (sc.skinRes("imgs/buttons/"+btn+".png") != NULL) { + sc["imgs/buttons/"+btn+".png"]->blit(s, x, y-7); + re.w = sc["imgs/buttons/"+btn+".png"]->raw->w+3; + s->write(font, text, x+re.w, y, SFontHAlignLeft, SFontVAlignMiddle); + re.w += font->getTextWidth(text); + } + return x+re.w+6; +} + +int GMenu2X::drawButtonRight(Surface *s, string btn, string text, int x, int y) { + if (y<0) y = resY+y; + if (sc.skinRes("imgs/buttons/"+btn+".png") != NULL) { + x -= 16; + sc["imgs/buttons/"+btn+".png"]->blit(s, x, y-7); + x -= 3; + s->write(font, text, x, y, SFontHAlignRight, SFontVAlignMiddle); + return x-6-font->getTextWidth(text); + } + return x-6; +} + +void GMenu2X::drawScrollBar(uint pagesize, uint totalsize, uint pagepos, uint top, uint height) { + if (totalsize<=pagesize) return; + + s->rectangle(resX-8, top, 7, height, skinConfColors["selectionBg"]); + + //internal bar total height = height-2 + //bar size + uint bs = (height-2) * pagesize / totalsize; + //bar y position + uint by = (height-2) * pagepos / totalsize; + by = top+2+by; + if (by+bs>top+height-2) by = top+height-2-bs; + + + s->box(resX-6, by, 3, bs, skinConfColors["selectionBg"]); +} + +void GMenu2X::drawTitleIcon(string icon, bool skinRes, Surface *s) { + if (s==NULL) s = this->s; + + Surface *i = NULL; + if (!icon.empty()) { + if (skinRes) + i = sc.skinRes(icon); + else + i = sc[icon]; + } + + if (i==NULL) + i = sc.skinRes("icons/generic.png"); + + i->blit(s,4,(skinConfInt["topBarHeight"]-32)/2); +} + +void GMenu2X::writeTitle(string title, Surface *s) { + if (s==NULL) s = this->s; + s->write(font,title,40, skinConfInt["topBarHeight"]/4, SFontHAlignLeft, SFontVAlignMiddle); +} + +void GMenu2X::writeSubTitle(string subtitle, Surface *s) { + if (s==NULL) s = this->s; + s->write(font,subtitle,40, skinConfInt["topBarHeight"]/4*3, SFontHAlignLeft, SFontVAlignMiddle); +} + +void GMenu2X::drawTopBar(Surface *s) { + if (s==NULL) s = this->s; + + Surface *bar = sc.skinRes("imgs/topbar.png"); + if (bar != NULL) + bar->blit(s, 0, 0); + else + s->box(0, 0, resX, skinConfInt["topBarHeight"], skinConfColors["topBarBg"]); +} + +void GMenu2X::drawBottomBar(Surface *s) { + if (s==NULL) s = this->s; + + Surface *bar = sc.skinRes("imgs/bottombar.png"); + if (bar != NULL) + bar->blit(s, 0, resY-bar->raw->h); + else + s->box(0, resY-20, resX, 20, skinConfColors["bottomBarBg"]); +} diff --git a/src/gmenu2x.h b/src/gmenu2x.h new file mode 100644 index 0000000..8c0d46c --- /dev/null +++ b/src/gmenu2x.h @@ -0,0 +1,242 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef GMENU2X_H +#define GMENU2X_H + +#include +#include +#include + +#include "surfacecollection.h" +#include "iconbutton.h" +#include "translator.h" +#include "FastDelegate.h" +#include "utilities.h" +#include "touchscreen.h" +#include "inputmanager.h" + +const int MAX_VOLUME_SCALE_FACTOR = 200; +// Default values - going to add settings adjustment, saving, loading and such +const int VOLUME_SCALER_MUTE = 0; +const int VOLUME_SCALER_PHONES = 65; +const int VOLUME_SCALER_NORMAL = 100; +const int VOLUME_MODE_MUTE = 0; +const int VOLUME_MODE_PHONES = 1; +const int VOLUME_MODE_NORMAL = 2; +const int BATTERY_READS = 10; + +const int LOOP_DELAY=30000; + +extern void jz_cpuspeed(unsigned clockspeed); + +using std::string; +using fastdelegate::FastDelegate0; +using google::dense_hash_map; + +typedef FastDelegate0<> MenuAction; +typedef dense_hash_map > ConfStrHash; +typedef dense_hash_map > ConfIntHash; +typedef dense_hash_map > ConfRGBAHash; + +typedef struct { + unsigned short batt; + unsigned short remocon; +} MMSP2ADC; + +struct MenuOption { + string text; + MenuAction action; +}; + +class Menu; + +class GMenu2X { +private: + string path; //!< Contains the working directory of GMenu2X + /*! + Retrieves the free disk space on the sd + @return String containing a human readable representation of the free disk space + */ + string getDiskFree(); + unsigned short cpuX; //!< Offset for displaying cpu clock information + unsigned short volumeX; //!< Offset for displaying volume level + unsigned short manualX; //!< Offset for displaying the manual indicator in the taskbar + /*! + Reads the current battery state and returns a number representing it's level of charge + @return A number representing battery charge. 0 means fully discharged. 5 means fully charged. 6 represents a gp2x using AC power. + */ + unsigned short getBatteryLevel(); + FILE* batteryHandle, *backlightHandle, *usbHandle, *acHandle; + void browsePath(string path, vector* directories, vector* files); + /*! + Starts the scanning of the nand and sd filesystems, searching for dge and gpu files and creating the links in 2 dedicated sections. + */ + void scanner(); + /*! + Performs the actual scan in the given path and populates the files vector with the results. The creation of the links is not performed here. + @see scanner + */ + void scanPath(string path, vector *files); + + /*! + Displays a selector and launches the specified executable file + */ + void explorer(); + + bool inet, //!< Represents the configuration of the basic network services. @see readCommonIni @see usbnet @see samba @see web + usbnet, + samba, + web; + string ip, defaultgw, lastSelectorDir; + int lastSelectorElement; + void readConfig(); + void readConfigOpen2x(); + void readTmp(); + void readCommonIni(); + void writeCommonIni(); + + void initServices(); + void initFont(); + void initMenu(); + +#ifdef TARGET_GP2X + unsigned long gp2x_mem; + unsigned short *gp2x_memregs; + volatile unsigned short *MEM_REG; + int cx25874; //tv-out +#endif + void gp2x_tvout_on(bool pal); + void gp2x_tvout_off(); + void gp2x_init(); + void gp2x_deinit(); + void toggleTvOut(); + +public: + GMenu2X(int argc, char *argv[]); + ~GMenu2X(); + void quit(); + + /* + * Variables needed for elements disposition + */ + uint resX, resY, halfX, halfY; + uint bottomBarIconY, bottomBarTextY, linkColumns, linkRows; + + /*! + Retrieves the parent directory of GMenu2X. + This functions is used to initialize the "path" variable. + @see path + @return String containing the parent directory + */ + string getExePath(); + + InputManager input; + Touchscreen ts; + + //Configuration hashes + ConfStrHash confStr, skinConfStr; + ConfIntHash confInt, skinConfInt; + ConfRGBAHash skinConfColors; + + //Configuration settings + bool useSelectionPng; + void setSkin(string skin, bool setWallpaper = true); + //firmware type and version + string fwType, fwVersion; + //gp2x type + bool f200; + + // Open2x settings --------------------------------------------------------- + bool o2x_usb_net_on_boot, o2x_ftp_on_boot, o2x_telnet_on_boot, o2x_gp2xjoy_on_boot, o2x_usb_host_on_boot, o2x_usb_hid_on_boot, o2x_usb_storage_on_boot; + string o2x_usb_net_ip; + int volumeMode, savedVolumeMode; // just use the const int scale values at top of source + + // Volume scaling values to store from config files + int volumeScalerPhones; + int volumeScalerNormal; + //-------------------------------------------------------------------------- + + SurfaceCollection sc; + Translator tr; + Surface *s, *bg; + ASFont *font; + + //Status functions + int main(); + void options(); + void settingsOpen2x(); + void skinMenu(); + void activateSdUsb(); + void activateNandUsb(); + void activateRootUsb(); + void about(); + void viewLog(); + void contextMenu(); + void changeWallpaper(); + void saveScreenshot(); + + void applyRamTimings(); + void applyDefaultTimings(); + + void setClock(unsigned mhz); + void setGamma(int gamma); + + void setVolume(int vol); + int getVolume(); + void setVolumeScaler(int scaler); + int getVolumeScaler(); + + void setBacklight(int val); + int getBackLight(); + + void setInputSpeed(); + + void writeConfig(); + void writeConfigOpen2x(); + void writeSkinConfig(); + void writeTmp(int selelem=-1, string selectordir=""); + + void ledOn(); + void ledOff(); + + void addLink(); + void editLink(); + void deleteLink(); + void addSection(); + void renameSection(); + void deleteSection(); + + void initBG(); + int drawButton(IconButton *btn, int x=5, int y=-10); + int drawButton(Surface *s, string btn, string text, int x=5, int y=-10); + int drawButtonRight(Surface *s, string btn, string text, int x=5, int y=-10); + void drawScrollBar(uint pagesize, uint totalsize, uint pagepos, uint top, uint height); + + void drawTitleIcon(string icon, bool skinRes=true, Surface *s=NULL); + void writeTitle(string title, Surface *s=NULL); + void writeSubTitle(string subtitle, Surface *s=NULL); + void drawTopBar(Surface *s=NULL); + void drawBottomBar(Surface *s=NULL); + + Menu* menu; +}; + +#endif diff --git a/src/gp2x.h b/src/gp2x.h new file mode 100644 index 0000000..3adb7d3 --- /dev/null +++ b/src/gp2x.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include + +#define GP2X_CLK_FREQ 7372800 + +#define GP2X_BUTTON_UP (0) +#define GP2X_BUTTON_DOWN (4) +#define GP2X_BUTTON_LEFT (2) +#define GP2X_BUTTON_RIGHT (6) +#define GP2X_BUTTON_UPLEFT (1) +#define GP2X_BUTTON_UPRIGHT (7) +#define GP2X_BUTTON_DOWNLEFT (3) +#define GP2X_BUTTON_DOWNRIGHT (5) +#define GP2X_BUTTON_CLICK (18) +#define GP2X_BUTTON_A (12) +#define GP2X_BUTTON_B (13) +#define GP2X_BUTTON_START (8) +#define GP2X_BUTTON_SELECT (9) +#define GP2X_BUTTON_VOLUP (16) +#define GP2X_BUTTON_VOLDOWN (17) + +#ifdef GP2X_OLDSDL_FIX + #define GP2X_BUTTON_X (15) + #define GP2X_BUTTON_Y (14) + #define GP2X_BUTTON_L (11) + #define GP2X_BUTTON_R (10) +#else + #define GP2X_BUTTON_X (14) + #define GP2X_BUTTON_Y (15) + #define GP2X_BUTTON_L (10) + #define GP2X_BUTTON_R (11) +#endif + +#define FBMMSP2CTRL 0x4619 diff --git a/src/iconbutton.cpp b/src/iconbutton.cpp new file mode 100644 index 0000000..bca0050 --- /dev/null +++ b/src/iconbutton.cpp @@ -0,0 +1,121 @@ +#include "iconbutton.h" +#include "gmenu2x.h" + +using namespace std; +using namespace fastdelegate; + +IconButton::IconButton(GMenu2X *gmenu2x, string icon, string label) : Button(gmenu2x) { + this->gmenu2x = gmenu2x; + this->icon = icon; + labelPosition = IconButton::DISP_RIGHT; + labelMargin = 2; + this->setLabel(label); +} + +void IconButton::setPosition(int x, int y) { + if (rect.x != x && rect.y != y) { + Button::setPosition(x,y); + recalcSize(); + } +} + +void IconButton::paint() { + uint margin = labelMargin; + if (gmenu2x->sc[icon] == NULL || label == "") + margin = 0; + if (gmenu2x->sc[icon] != NULL) + gmenu2x->sc[icon]->blit(gmenu2x->s,iconRect); + if (label != "") + gmenu2x->s->write(gmenu2x->font, label, labelRect.x, labelRect.y, labelHAlign, labelVAlign); +} + +bool IconButton::paintHover() { + return true; +} + +void IconButton::recalcSize() { + uint h = 0, w = 0; + uint margin = labelMargin; + + if (gmenu2x->sc[icon] == NULL || label == "") + margin = 0; + + if (gmenu2x->sc[icon] != NULL) { + w += gmenu2x->sc[icon]->raw->w; + h += gmenu2x->sc[icon]->raw->h; + iconRect.w = w; + iconRect.h = h; + iconRect.x = rect.x; + iconRect.y = rect.y; + } else { + iconRect.x = 0; + iconRect.y = 0; + iconRect.w = 0; + iconRect.h = 0; + } + + if (label != "") { + labelRect.w = gmenu2x->font->getTextWidth(label); + labelRect.h = gmenu2x->font->getHeight(); + if (labelPosition == IconButton::DISP_LEFT || labelPosition == IconButton::DISP_RIGHT) { + w += margin + labelRect.w; + //if (labelRect.h > h) h = labelRect.h; + labelHAlign = SFontHAlignLeft; + labelVAlign = SFontVAlignMiddle; + } else { + h += margin + labelRect.h; + //if (labelRect.w > w) w = labelRect.w; + labelHAlign = SFontHAlignCenter; + labelVAlign = SFontVAlignTop; + } + + switch (labelPosition) { + case IconButton::DISP_BOTTOM: + labelRect.x = iconRect.x + iconRect.w/2; + labelRect.y = iconRect.y + iconRect.h + margin; + break; + case IconButton::DISP_TOP: + labelRect.x = iconRect.x + iconRect.w/2; + labelRect.y = rect.y; + iconRect.y += labelRect.h + margin; + break; + case IconButton::DISP_LEFT: + labelRect.x = rect.x; + labelRect.y = rect.y+h/2; + iconRect.x += labelRect.w + margin; + break; + default: + labelRect.x = iconRect.x + iconRect.w + margin; + labelRect.y = rect.y+h/2; + break; + } + } + setSize(w, h); +} + +string IconButton::getLabel() { + return label; +} + +void IconButton::setLabel(string label) { + this->label = label; +} + +void IconButton::setLabelPosition(int pos, int margin) { + labelPosition = pos; + labelMargin = margin; + recalcSize(); +} + +string IconButton::getIcon() { + return icon; +} + +void IconButton::setIcon(string icon) { + this->icon = icon; + recalcSize(); +} + +void IconButton::setAction(ButtonAction action) { + this->action = action; +} diff --git a/src/iconbutton.h b/src/iconbutton.h new file mode 100644 index 0000000..7397c1b --- /dev/null +++ b/src/iconbutton.h @@ -0,0 +1,43 @@ +#ifndef ICONBUTTON_H +#define ICONBUTTON_H + +#include +#include "button.h" + +using std::string; + +class GMenu2X; + +class IconButton : public Button { +protected: + string icon, label; + int labelPosition, labelMargin; + unsigned short labelHAlign, labelVAlign; + void recalcSize(); + SDL_Rect iconRect, labelRect; + +public: + static const int DISP_RIGHT = 0; + static const int DISP_LEFT = 1; + static const int DISP_TOP = 2; + static const int DISP_BOTTOM = 3; + + IconButton(GMenu2X *gmenu2x, string icon, string label=""); + virtual ~IconButton() {}; + + virtual void paint(); + virtual bool paintHover(); + + void setPosition(int x, int y); + + string getLabel(); + void setLabel(string label); + void setLabelPosition(int pos, int margin); + + string getIcon(); + void setIcon(string icon); + + void setAction(ButtonAction action); +}; + +#endif diff --git a/src/imagedialog.cpp b/src/imagedialog.cpp new file mode 100644 index 0000000..4bfdd31 --- /dev/null +++ b/src/imagedialog.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +//for browsing the filesystem +#include +#include +#include + +#include "imagedialog.h" +#include "filelister.h" + +using namespace std; + +ImageDialog::ImageDialog(GMenu2X *gmenu2x, string text, string filter, string file) : FileDialog(gmenu2x, text, filter, file) { + this->gmenu2x = gmenu2x; + this->text = text; + this->filter = filter; + this->file = ""; + setPath("/card"); + title = "Image Browser"; + if (!file.empty()) { + file = strreplace(file,"skin:",gmenu2x->getExePath()+"skins/"+gmenu2x->confStr["skin"]+"/"); + string::size_type pos = file.rfind("/"); + if (pos != string::npos) { + setPath( file.substr(0, pos) ); + cout << "ib: " << path() << endl; + this->file = file.substr(pos+1,file.length()); + } + } + selRow = 0; +} + +ImageDialog::~ImageDialog() { + previews.clear(); +} + +void ImageDialog::beforeFileList() { + if (fl.isFile(selected) && fileExists(path()+"/"+fl[selected])) + previews[path()+"/"+fl[selected]]->blitRight(gmenu2x->s, 310, 43); +} + +void ImageDialog::onChangeDir() { + previews.clear(); +} diff --git a/src/imagedialog.h b/src/imagedialog.h new file mode 100644 index 0000000..2d0652a --- /dev/null +++ b/src/imagedialog.h @@ -0,0 +1,40 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef IMAGEDIALOG_H_ +#define IMAGEDIALOG_H_ + +#include +#include "filedialog.h" + +using std::string; +using std::vector; + +class ImageDialog : public FileDialog { +protected: + SurfaceCollection previews; +public: + ImageDialog(GMenu2X *gmenu2x, string text, string filter="", string file=""); + virtual ~ImageDialog(); + inline virtual void beforeFileList(); + inline virtual void onChangeDir(); +}; + +#endif /*IMAGEDIALOG_H_*/ diff --git a/src/inputdialog.cpp b/src/inputdialog.cpp new file mode 100644 index 0000000..c802207 --- /dev/null +++ b/src/inputdialog.cpp @@ -0,0 +1,302 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +#include "inputdialog.h" + +using namespace std; +using namespace fastdelegate; + +InputDialog::InputDialog(GMenu2X *gmenu2x, string text, string startvalue, string title, string icon) { + this->gmenu2x = gmenu2x; + if (title=="") { + this->title = text; + this->text = ""; + } else { + this->title = title; + this->text = text; + } + this->icon = ""; + if (icon!="" && gmenu2x->sc[icon] != NULL) + this->icon = icon; + + input = startvalue; + selCol = 0; + selRow = 0; + keyboard.resize(7); + + keyboard[0].push_back("abcdefghijklm"); + keyboard[0].push_back("nopqrstuvwxyz"); + keyboard[0].push_back("0123456789. "); + + keyboard[1].push_back("ABCDEFGHIJKLM"); + keyboard[1].push_back("NOPQRSTUVWXYZ"); + keyboard[1].push_back("_\"'`.,:;!? "); + + + keyboard[2].push_back("¡¿*+-/\\&<=>|"); + keyboard[2].push_back("()[]{}@#$%^~"); + keyboard[2].push_back("_\"'`.,:;!? "); + + + keyboard[3].push_back("àáèéìíòóùúýäõ"); + keyboard[3].push_back("ëïöüÿâêîôûåãñ"); + keyboard[3].push_back("ÄÄěľĺňôřŕšťůž"); + keyboard[3].push_back("ąćęłńśżź "); + + keyboard[4].push_back("ÀÃÈÉÌÃÒÓÙÚÃÄÕ"); + keyboard[4].push_back("ËÃÖÜŸÂÊÎÔÛÅÃÑ"); + keyboard[4].push_back("ČĎĚĽĹŇÔŘŔŠŤŮŽ"); + keyboard[4].push_back("ĄĆĘÅŃŚŻŹ "); + + + keyboard[5].push_back("æçабвгдеёжзий "); + keyboard[5].push_back("клмнопрÑтуфхцч"); + keyboard[5].push_back("шщъыьÑÑŽÑøðßÃÞþ"); + + keyboard[6].push_back("ÆÇÐБВГДЕÐЖЗИЙ "); + keyboard[6].push_back("КЛМÐОПРСТУФХЦЧ"); + keyboard[6].push_back("ШЩЪЫЬЭЮЯØðßÃÞþ"); + + setKeyboard(0); + + ButtonAction actBackspace = MakeDelegate(this, &InputDialog::backspace); + + btnBackspaceX = new IconButton(gmenu2x, "skin:imgs/buttons/x.png"); + btnBackspaceX->setAction(actBackspace); + + btnBackspaceL = new IconButton(gmenu2x, "skin:imgs/buttons/l.png", gmenu2x->tr["Backspace"]); + btnBackspaceL->setAction(actBackspace); + + btnSpace = new IconButton(gmenu2x, "skin:imgs/buttons/r.png", gmenu2x->tr["Space"]); + btnSpace->setAction(MakeDelegate(this, &InputDialog::space)); + + btnConfirm = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Confirm"]); + btnConfirm->setAction(MakeDelegate(this, &InputDialog::confirm)); + + btnChangeKeys = new IconButton(gmenu2x, "skin:imgs/buttons/y.png", gmenu2x->tr["Change keys"]); + btnChangeKeys->setAction(MakeDelegate(this, &InputDialog::changeKeys)); +} + +void InputDialog::setKeyboard(int kb) { + kb = constrain(kb,0,keyboard.size()-1); + curKeyboard = kb; + this->kb = &(keyboard[kb]); + kbLength = this->kb->at(0).length(); + for (int x = 0, l = kbLength; xfont->utf8Code(this->kb->at(0)[x])) { + kbLength--; + x++; + } + + kbLeft = 160 - kbLength*KEY_WIDTH/2; + kbWidth = kbLength*KEY_WIDTH+3; + kbHeight = (this->kb->size()+1)*KEY_HEIGHT+3; + + kbRect.x = kbLeft-3; + kbRect.y = KB_TOP-2; + kbRect.w = kbWidth; + kbRect.h = kbHeight; +} + +bool InputDialog::exec() { + SDL_Rect box = {0, 60, 0, gmenu2x->font->getHeight()+4}; + + Uint32 caretTick = 0, curTick; + bool caretOn = true; + + uint action; + close = false; + ok = true; + while (!close) { + gmenu2x->bg->blit(gmenu2x->s,0,0); + gmenu2x->writeTitle(title); + gmenu2x->writeSubTitle(text); + gmenu2x->drawTitleIcon(icon); + + gmenu2x->drawButton(gmenu2x->s, "y", gmenu2x->tr["Change keys"], + gmenu2x->drawButton(gmenu2x->s, "b", gmenu2x->tr["Confirm"], + gmenu2x->drawButton(gmenu2x->s, "r", gmenu2x->tr["Space"], + gmenu2x->drawButton(btnBackspaceL, + gmenu2x->drawButton(btnBackspaceX)-6)))); + + box.w = gmenu2x->font->getTextWidth(input)+18; + box.x = 160-box.w/2; + gmenu2x->s->box(box.x, box.y, box.w, box.h, gmenu2x->skinConfColors["selectionBg"]); + gmenu2x->s->rectangle(box.x, box.y, box.w, box.h, gmenu2x->skinConfColors["selectionBg"]); + + gmenu2x->s->write(gmenu2x->font, input, box.x+5, box.y+box.h-2, SFontHAlignLeft, SFontVAlignBottom); + + curTick = SDL_GetTicks(); + if (curTick-caretTick>=600) { + caretOn = !caretOn; + caretTick = curTick; + } + + if (caretOn) gmenu2x->s->box(box.x+box.w-12, box.y+3, 8, box.h-6, gmenu2x->skinConfColors["selectionBg"]); + + if (gmenu2x->f200) gmenu2x->ts.poll(); + action = drawVirtualKeyboard(); + gmenu2x->s->flip(); + + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_START] ) action = ID_ACTION_CLOSE; + if ( gmenu2x->input[ACTION_UP ] ) action = ID_ACTION_UP; + if ( gmenu2x->input[ACTION_DOWN ] ) action = ID_ACTION_DOWN; + if ( gmenu2x->input[ACTION_LEFT ] ) action = ID_ACTION_LEFT; + if ( gmenu2x->input[ACTION_RIGHT] ) action = ID_ACTION_RIGHT; + if ( gmenu2x->input[ACTION_B] ) action = ID_ACTION_SELECT; + if ( gmenu2x->input[ACTION_Y] ) action = ID_ACTION_KB_CHANGE; + if ( gmenu2x->input[ACTION_X] || gmenu2x->input[ACTION_L] ) action = ID_ACTION_BACKSPACE; + if ( gmenu2x->input[ACTION_R ] ) action = ID_ACTION_SPACE; + + switch (action) { + case ID_ACTION_CLOSE: { + ok = false; + close = true; + } break; + case ID_ACTION_UP: { + selRow--; + } break; + case ID_ACTION_DOWN: { + selRow++; + if (selRow==(int)kb->size()) selCol = selCol<8 ? 0 : 1; + } break; + case ID_ACTION_LEFT: { + selCol--; + } break; + case ID_ACTION_RIGHT: { + selCol++; + } break; + case ID_ACTION_BACKSPACE: backspace(); break; + case ID_ACTION_SPACE: space(); break; + case ID_ACTION_KB_CHANGE: changeKeys(); break; + case ID_ACTION_SELECT: confirm(); break; + } + } + + return ok; +} + +void InputDialog::backspace() { + // check for utf8 characters + input = input.substr(0,input.length()-( gmenu2x->font->utf8Code(input[input.length()-2]) ? 2 : 1 )); +} + +void InputDialog::space() { + // check for utf8 characters + input += " "; +} + +void InputDialog::confirm() { + if (selRow==(int)kb->size()) { + if (selCol==0) + ok = false; + close = true; + } else { + bool utf8; + int xc=0; + for (uint x=0; xat(selRow).length(); x++) { + utf8 = gmenu2x->font->utf8Code(kb->at(selRow)[x]); + if (xc==selCol) input += kb->at(selRow).substr(x, utf8 ? 2 : 1); + if (utf8) x++; + xc++; + } + } +} + +void InputDialog::changeKeys() { + if (curKeyboard==6) + setKeyboard(0); + else + setKeyboard(curKeyboard+1); +} + +int InputDialog::drawVirtualKeyboard() { + int action = ID_NO_ACTION; + + //keyboard border + gmenu2x->s->rectangle(kbRect, gmenu2x->skinConfColors["selectionBg"]); + + if (selCol<0) selCol = selRow==(int)kb->size() ? 1 : kbLength-1; + if (selCol>=(int)kbLength) selCol = 0; + if (selRow<0) selRow = kb->size()-1; + if (selRow>(int)kb->size()) selRow = 0; + + //selection + if (selRow<(int)kb->size()) + gmenu2x->s->box(kbLeft+selCol*KEY_WIDTH-1, KB_TOP+selRow*KEY_HEIGHT, KEY_WIDTH-1, KEY_HEIGHT-2, gmenu2x->skinConfColors["selectionBg"]); + else { + if (selCol>1) selCol = 0; + if (selCol<0) selCol = 1; + gmenu2x->s->box(kbLeft+selCol*kbLength*KEY_WIDTH/2-1, KB_TOP+kb->size()*KEY_HEIGHT, kbLength*KEY_WIDTH/2-1, KEY_HEIGHT-1, gmenu2x->skinConfColors["selectionBg"]); + } + + //keys + for (uint l=0; lsize(); l++) { + string line = kb->at(l); + for (uint x=0, xc=0; xfont->utf8Code(line[x])) { + charX = line.substr(x,2); + x++; + } else + charX = line[x]; + + SDL_Rect re = {kbLeft+xc*KEY_WIDTH-1, KB_TOP+l*KEY_HEIGHT, KEY_WIDTH-1, KEY_HEIGHT-2}; + + //if ts on rect, change selection + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(re)) { + selCol = xc; + selRow = l; + } + + gmenu2x->s->rectangle(re, gmenu2x->skinConfColors["selectionBg"]); + gmenu2x->s->write(gmenu2x->font, charX, kbLeft+xc*KEY_WIDTH+KEY_WIDTH/2-1, KB_TOP+l*KEY_HEIGHT+KEY_HEIGHT/2, SFontHAlignCenter, SFontVAlignMiddle); + xc++; + } + } + + //Ok/Cancel + SDL_Rect re = {kbLeft-1, KB_TOP+kb->size()*KEY_HEIGHT, kbLength*KEY_WIDTH/2-1, KEY_HEIGHT-1}; + gmenu2x->s->rectangle(re, gmenu2x->skinConfColors["selectionBg"]); + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(re)) { + selCol = 0; + selRow = kb->size(); + } + gmenu2x->s->write(gmenu2x->font, gmenu2x->tr["Cancel"], (int)(160-kbLength*KEY_WIDTH/4), KB_TOP+kb->size()*KEY_HEIGHT+KEY_HEIGHT/2, SFontHAlignCenter, SFontVAlignMiddle); + + re.x = kbLeft+kbLength*KEY_WIDTH/2-1; + gmenu2x->s->rectangle(re, gmenu2x->skinConfColors["selectionBg"]); + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(re)) { + selCol = 1; + selRow = kb->size(); + } + gmenu2x->s->write(gmenu2x->font, gmenu2x->tr["OK"], (int)(160+kbLength*KEY_WIDTH/4), KB_TOP+kb->size()*KEY_HEIGHT+KEY_HEIGHT/2, SFontHAlignCenter, SFontVAlignMiddle); + + //if ts released + if (gmenu2x->f200 && gmenu2x->ts.wasPressed && !gmenu2x->ts.pressed() && gmenu2x->ts.inRect(kbRect)) + action = ID_ACTION_SELECT; + + return action; +} diff --git a/src/inputdialog.h b/src/inputdialog.h new file mode 100644 index 0000000..2cdb060 --- /dev/null +++ b/src/inputdialog.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef INPUTDIALOG_H_ +#define INPUTDIALOG_H_ + +#define KEY_WIDTH 20 +#define KEY_HEIGHT 20 +#define KB_TOP 90 + +#define ID_NO_ACTION 0 +#define ID_ACTION_CLOSE 1 +#define ID_ACTION_UP 2 +#define ID_ACTION_DOWN 3 +#define ID_ACTION_LEFT 4 +#define ID_ACTION_RIGHT 5 +#define ID_ACTION_BACKSPACE 6 +#define ID_ACTION_SPACE 7 +#define ID_ACTION_GOUP 8 +#define ID_ACTION_SELECT 9 +#define ID_ACTION_KB_CHANGE 10 + +#include +#include "gmenu2x.h" + +using std::string; +using std::vector; + +typedef vector stringlist; + +class InputDialog { +private: + int selRow, selCol; + bool close, ok; + string title, text, icon; + GMenu2X *gmenu2x; + short curKeyboard; + vector keyboard; + stringlist *kb; + int kbLength, kbWidth, kbHeight, kbLeft; + SDL_Rect kbRect; + IconButton *btnBackspaceX, *btnBackspaceL, *btnSpace, *btnConfirm, *btnChangeKeys; + + void backspace(); + void space(); + void confirm(); + void changeKeys(); + + int drawVirtualKeyboard(); + void setKeyboard(int); + +public: + InputDialog(GMenu2X *gmenu2x, string text, string startvalue="", string title="", string icon=""); + + string input; + bool exec(); +}; + +#endif /*INPUTDIALOG_H_*/ diff --git a/src/inputmanager.cpp b/src/inputmanager.cpp new file mode 100644 index 0000000..93e2529 --- /dev/null +++ b/src/inputmanager.cpp @@ -0,0 +1,198 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include +#include "inputmanager.h" +#include "utilities.h" + +using namespace std; + +InputManager::InputManager() {} + +InputManager::~InputManager() { + for (uint x=0; x values; + + while (getline(inf, line, '\n')) { + pos = line.find("="); + name = trim(line.substr(0,pos)); + value = trim(line.substr(pos+1,line.length())); + int action = -1; + + if (name=="up") action = ACTION_UP; + else if (name=="down") action = ACTION_DOWN; + else if (name=="left") action = ACTION_LEFT; + else if (name=="right") action = ACTION_RIGHT; + else if (name=="a") action = ACTION_A; + else if (name=="b") action = ACTION_B; + else if (name=="x") action = ACTION_X; + else if (name=="y") action = ACTION_Y; + else if (name=="l") action = ACTION_L; + else if (name=="r") action = ACTION_R; + else if (name=="start") action = ACTION_START; + else if (name=="select") action = ACTION_SELECT; + else if (name=="volup") action = ACTION_VOLUP; + else if (name=="voldown") action = ACTION_VOLDOWN; + + if (action >= 0) { + split(values, value, ","); + if (values.size() >= 2) { + + if (values[0] == "joystickbutton" && values.size()==3) { + InputMap map; + map.type = InputManager::MAPPING_TYPE_BUTTON; + map.num = atoi(values[1].c_str()); + map.value = atoi(values[2].c_str()); + map.treshold = 0; + mappings[action].push_back(map); + } else if (values[0] == "joystickaxys" && values.size()==4) { + InputMap map; + map.type = InputManager::MAPPING_TYPE_AXYS; + map.num = atoi(values[1].c_str()); + map.value = atoi(values[2].c_str()); + map.treshold = atoi(values[3].c_str()); + mappings[action].push_back(map); + } else if (values[0] == "keyboard") { + InputMap map; + map.type = InputManager::MAPPING_TYPE_KEYPRESS; + map.value = atoi(values[1].c_str()); + mappings[action].push_back(map); + } + + } + } + } + inf.close(); + } + } +} + +void InputManager::setActionsCount(int count) { + actions.clear(); + actionTick.clear(); + interval.clear(); + for (int x=0; xinterval[x]) { + actions[x] = true; + actionTick[x] = tick; + } + } else { + actionTick[x] = 0; + } + } +} + +int InputManager::count() { + return actions.size(); +} + +void InputManager::setInterval(int ms, int action) { + if (action<0) + for (uint x=0; x=actions.size()) return false; + return actions[action]; +} + +bool InputManager::isActive(int action) { + for (uint x=0; x0 && axyspos > map.treshold) return true; + } + break; + case InputManager::MAPPING_TYPE_KEYPRESS: + for (uint ex=0; ex +#include +#include +#include + +using std::vector; +using std::string; + +typedef struct { + int type; + uint num; + int value; + int treshold; +} InputMap; + +typedef vector MappingList; +typedef vector SDLEventList; + +/** +Manages all input peripherals +@author Massimiliano Torromeo +*/ +class InputManager { +private: + InputMap getInputMapping(int action); + vector actionTick; + vector interval; + SDLEventList events; + +public: + static const int MAPPING_TYPE_UNDEFINED = -1; + static const int MAPPING_TYPE_BUTTON = 0; + static const int MAPPING_TYPE_AXYS = 1; + static const int MAPPING_TYPE_KEYPRESS = 2; + + InputManager(); + ~InputManager(); + void init(string conffile = "input.conf"); + + vector joysticks; + vector actions; + vector mappings; + + void update(); + int count(); + void setActionsCount(int count); + void setInterval(int ms, int action = -1); + bool operator[](int action); + bool isActive(int action); +}; + +#endif diff --git a/src/jz4740.h b/src/jz4740.h new file mode 100644 index 0000000..1ca84d3 --- /dev/null +++ b/src/jz4740.h @@ -0,0 +1,5212 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2008 by Maurus Cuelenaere + * Copyright (C) 2006-2007 by Ingenic Semiconductor Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +/* + * linux/include/asm-mips/mach-jz4740/jz4740.h + * + * JZ4740 common definition. + * + * Copyright (C) 2006 - 2007 Ingenic Semiconductor Inc. + * + * Author: + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * Include file for Ingenic Semiconductor's JZ4740 CPU. + */ +#ifndef __JZ4740_H__ +#define __JZ4740_H__ + +#ifndef __ASSEMBLY__ + +#define REG8(addr) (*(volatile unsigned char *)(addr)) +#define REG16(addr) (*(volatile unsigned short *)(addr)) +#define REG32(addr) (*(volatile unsigned int *)(addr)) + +#endif /* !ASSEMBLY */ + +/************************************************************************* + * Boot ROM Specification + */ + +/* NOR Boot config */ +#define JZ4740_NORBOOT_8BIT 0x00000000 /* 8-bit data bus flash */ +#define JZ4740_NORBOOT_16BIT 0x10101010 /* 16-bit data bus flash */ +#define JZ4740_NORBOOT_32BIT 0x20202020 /* 32-bit data bus flash */ + +/* NAND Boot config */ +#define JZ4740_NANDBOOT_B8R3 0xffffffff /* 8-bit bus & 3 row cycles */ +#define JZ4740_NANDBOOT_B8R2 0xf0f0f0f0 /* 8-bit bus & 2 row cycles */ +#define JZ4740_NANDBOOT_B16R3 0x0f0f0f0f /* 16-bit bus & 3 row cycles */ +#define JZ4740_NANDBOOT_B16R2 0x00000000 /* 16-bit bus & 2 row cycles */ + + +/************************************************************************* + * Register Definitions + */ +#define CPM_BASE 0xB0000000 +#define INTC_BASE 0xB0001000 +#define TCU_BASE 0xB0002000 +#define WDT_BASE 0xB0002000 +#define RTC_BASE 0xB0003000 +#define GPIO_BASE 0xB0010000 +#define AIC_BASE 0xB0020000 +#define ICDC_BASE 0xB0020000 +#define MSC_BASE 0xB0021000 +#define UART0_BASE 0xB0030000 +#define I2C_BASE 0xB0042000 +#define SSI_BASE 0xB0043000 +#define SADC_BASE 0xB0070000 +#define EMC_BASE 0xB3010000 +#define DMAC_BASE 0xB3020000 +#define UHC_BASE 0xB3030000 +#define UDC_BASE 0xB3040000 +#define LCD_BASE 0xB3050000 +#define SLCD_BASE 0xB3050000 +#define CIM_BASE 0xB3060000 +#define ETH_BASE 0xB3100000 + + +/************************************************************************* + * INTC (Interrupt Controller) + *************************************************************************/ +#define INTC_ISR (INTC_BASE + 0x00) +#define INTC_IMR (INTC_BASE + 0x04) +#define INTC_IMSR (INTC_BASE + 0x08) +#define INTC_IMCR (INTC_BASE + 0x0c) +#define INTC_IPR (INTC_BASE + 0x10) + +#define REG_INTC_ISR REG32(INTC_ISR) +#define REG_INTC_IMR REG32(INTC_IMR) +#define REG_INTC_IMSR REG32(INTC_IMSR) +#define REG_INTC_IMCR REG32(INTC_IMCR) +#define REG_INTC_IPR REG32(INTC_IPR) + +// 1st-level interrupts +#define IRQ_I2C 1 +#define IRQ_EMC 2 +#define IRQ_UHC 3 +#define IRQ_UART0 9 +#define IRQ_SADC 12 +#define IRQ_MSC 14 +#define IRQ_RTC 15 +#define IRQ_SSI 16 +#define IRQ_CIM 17 +#define IRQ_AIC 18 +#define IRQ_ETH 19 +#define IRQ_DMAC 20 +#define IRQ_TCU2 21 +#define IRQ_TCU1 22 +#define IRQ_TCU0 23 +#define IRQ_UDC 24 +#define IRQ_GPIO3 25 +#define IRQ_GPIO2 26 +#define IRQ_GPIO1 27 +#define IRQ_GPIO0 28 +#define IRQ_IPU 29 +#define IRQ_LCD 30 + +// 2nd-level interrupts +#define IRQ_DMA_0 32 /* 32 to 37 for DMAC channel 0 to 5 */ +#define IRQ_GPIO_0 48 /* 48 to 175 for GPIO pin 0 to 127 */ + + +/************************************************************************* + * RTC + *************************************************************************/ +#define RTC_RCR (RTC_BASE + 0x00) /* RTC Control Register */ +#define RTC_RSR (RTC_BASE + 0x04) /* RTC Second Register */ +#define RTC_RSAR (RTC_BASE + 0x08) /* RTC Second Alarm Register */ +#define RTC_RGR (RTC_BASE + 0x0c) /* RTC Regulator Register */ + +#define RTC_HCR (RTC_BASE + 0x20) /* Hibernate Control Register */ +#define RTC_HWFCR (RTC_BASE + 0x24) /* Hibernate Wakeup Filter Counter Reg */ +#define RTC_HRCR (RTC_BASE + 0x28) /* Hibernate Reset Counter Register */ +#define RTC_HWCR (RTC_BASE + 0x2c) /* Hibernate Wakeup Control Register */ +#define RTC_HWRSR (RTC_BASE + 0x30) /* Hibernate Wakeup Status Register */ +#define RTC_HSPR (RTC_BASE + 0x34) /* Hibernate Scratch Pattern Register */ + +#define REG_RTC_RCR REG32(RTC_RCR) +#define REG_RTC_RSR REG32(RTC_RSR) +#define REG_RTC_RSAR REG32(RTC_RSAR) +#define REG_RTC_RGR REG32(RTC_RGR) +#define REG_RTC_HCR REG32(RTC_HCR) +#define REG_RTC_HWFCR REG32(RTC_HWFCR) +#define REG_RTC_HRCR REG32(RTC_HRCR) +#define REG_RTC_HWCR REG32(RTC_HWCR) +#define REG_RTC_HWRSR REG32(RTC_HWRSR) +#define REG_RTC_HSPR REG32(RTC_HSPR) + +/* RTC Control Register */ +#define RTC_RCR_WRDY (1 << 7) /* Write Ready Flag */ +#define RTC_RCR_HZ (1 << 6) /* 1Hz Flag */ +#define RTC_RCR_HZIE (1 << 5) /* 1Hz Interrupt Enable */ +#define RTC_RCR_AF (1 << 4) /* Alarm Flag */ +#define RTC_RCR_AF_BIT 4 /* Alarm Flag */ +#define RTC_RCR_AIE (1 << 3) /* Alarm Interrupt Enable */ +#define RTC_RCR_AE (1 << 2) /* Alarm Enable */ +#define RTC_RCR_RTCE (1 << 0) /* RTC Enable */ + +/* RTC Regulator Register */ +#define RTC_RGR_LOCK (1 << 31) /* Lock Bit */ +#define RTC_RGR_ADJC_BIT 16 +#define RTC_RGR_ADJC_MASK (0x3ff << RTC_RGR_ADJC_BIT) +#define RTC_RGR_NC1HZ_BIT 0 +#define RTC_RGR_NC1HZ_MASK (0xffff << RTC_RGR_NC1HZ_BIT) + +/* Hibernate Control Register */ +#define RTC_HCR_PD (1 << 0) /* Power Down */ + +/* Hibernate Wakeup Filter Counter Register */ +#define RTC_HWFCR_BIT 5 +#define RTC_HWFCR_MASK (0x7ff << RTC_HWFCR_BIT) + +/* Hibernate Reset Counter Register */ +#define RTC_HRCR_BIT 5 +#define RTC_HRCR_MASK (0x7f << RTC_HRCR_BIT) + +/* Hibernate Wakeup Control Register */ +#define RTC_HWCR_EALM (1 << 0) /* RTC alarm wakeup enable */ + +/* Hibernate Wakeup Status Register */ +#define RTC_HWRSR_HR (1 << 5) /* Hibernate reset */ +#define RTC_HWRSR_PPR (1 << 4) /* PPR reset */ +#define RTC_HWRSR_PIN (1 << 1) /* Wakeup pin status bit */ +#define RTC_HWRSR_ALM (1 << 0) /* RTC alarm status bit */ + + +/************************************************************************* + * CPM (Clock reset and Power control Management) + *************************************************************************/ +#define CPM_CPCCR (CPM_BASE+0x00) +#define CPM_CPPCR (CPM_BASE+0x10) +#define CPM_I2SCDR (CPM_BASE+0x60) +#define CPM_LPCDR (CPM_BASE+0x64) +#define CPM_MSCCDR (CPM_BASE+0x68) +#define CPM_UHCCDR (CPM_BASE+0x6C) + +#define CPM_LCR (CPM_BASE+0x04) +#define CPM_CLKGR (CPM_BASE+0x20) +#define CPM_SCR (CPM_BASE+0x24) + +#define CPM_HCR (CPM_BASE+0x30) +#define CPM_HWFCR (CPM_BASE+0x34) +#define CPM_HRCR (CPM_BASE+0x38) +#define CPM_HWCR (CPM_BASE+0x3c) +#define CPM_HWSR (CPM_BASE+0x40) +#define CPM_HSPR (CPM_BASE+0x44) + +#define CPM_RSR (CPM_BASE+0x08) + + +#define REG_CPM_CPCCR REG32(CPM_CPCCR) +#define REG_CPM_CPPCR REG32(CPM_CPPCR) +#define REG_CPM_I2SCDR REG32(CPM_I2SCDR) +#define REG_CPM_LPCDR REG32(CPM_LPCDR) +#define REG_CPM_MSCCDR REG32(CPM_MSCCDR) +#define REG_CPM_UHCCDR REG32(CPM_UHCCDR) + +#define REG_CPM_LCR REG32(CPM_LCR) +#define REG_CPM_CLKGR REG32(CPM_CLKGR) +#define REG_CPM_SCR REG32(CPM_SCR) +#define REG_CPM_HCR REG32(CPM_HCR) +#define REG_CPM_HWFCR REG32(CPM_HWFCR) +#define REG_CPM_HRCR REG32(CPM_HRCR) +#define REG_CPM_HWCR REG32(CPM_HWCR) +#define REG_CPM_HWSR REG32(CPM_HWSR) +#define REG_CPM_HSPR REG32(CPM_HSPR) + +#define REG_CPM_RSR REG32(CPM_RSR) + + +/* Clock Control Register */ +#define CPM_CPCCR_I2CS (1 << 31) +#define CPM_CPCCR_CLKOEN (1 << 30) +#define CPM_CPCCR_UCS (1 << 29) +#define CPM_CPCCR_UDIV_BIT 23 +#define CPM_CPCCR_UDIV_MASK (0x3f << CPM_CPCCR_UDIV_BIT) +#define CPM_CPCCR_CE (1 << 22) +#define CPM_CPCCR_PCS (1 << 21) +#define CPM_CPCCR_LDIV_BIT 16 +#define CPM_CPCCR_LDIV_MASK (0x1f << CPM_CPCCR_LDIV_BIT) +#define CPM_CPCCR_MDIV_BIT 12 +#define CPM_CPCCR_MDIV_MASK (0x0f << CPM_CPCCR_MDIV_BIT) +#define CPM_CPCCR_PDIV_BIT 8 +#define CPM_CPCCR_PDIV_MASK (0x0f << CPM_CPCCR_PDIV_BIT) +#define CPM_CPCCR_HDIV_BIT 4 +#define CPM_CPCCR_HDIV_MASK (0x0f << CPM_CPCCR_HDIV_BIT) +#define CPM_CPCCR_CDIV_BIT 0 +#define CPM_CPCCR_CDIV_MASK (0x0f << CPM_CPCCR_CDIV_BIT) + +/* I2S Clock Divider Register */ +#define CPM_I2SCDR_I2SDIV_BIT 0 +#define CPM_I2SCDR_I2SDIV_MASK (0x1ff << CPM_I2SCDR_I2SDIV_BIT) + +/* LCD Pixel Clock Divider Register */ +#define CPM_LPCDR_PIXDIV_BIT 0 +#define CPM_LPCDR_PIXDIV_MASK (0x1ff << CPM_LPCDR_PIXDIV_BIT) + +/* MSC Clock Divider Register */ +#define CPM_MSCCDR_MSCDIV_BIT 0 +#define CPM_MSCCDR_MSCDIV_MASK (0x1f << CPM_MSCCDR_MSCDIV_BIT) + +/* PLL Control Register */ +#define CPM_CPPCR_PLLM_BIT 23 +#define CPM_CPPCR_PLLM_MASK (0x1ff << CPM_CPPCR_PLLM_BIT) +#define CPM_CPPCR_PLLN_BIT 18 +#define CPM_CPPCR_PLLN_MASK (0x1f << CPM_CPPCR_PLLN_BIT) +#define CPM_CPPCR_PLLOD_BIT 16 +#define CPM_CPPCR_PLLOD_MASK (0x03 << CPM_CPPCR_PLLOD_BIT) +#define CPM_CPPCR_PLLS (1 << 10) +#define CPM_CPPCR_PLLBP (1 << 9) +#define CPM_CPPCR_PLLEN (1 << 8) +#define CPM_CPPCR_PLLST_BIT 0 +#define CPM_CPPCR_PLLST_MASK (0xff << CPM_CPPCR_PLLST_BIT) + +/* Low Power Control Register */ +#define CPM_LCR_DOZE_DUTY_BIT 3 +#define CPM_LCR_DOZE_DUTY_MASK (0x1f << CPM_LCR_DOZE_DUTY_BIT) +#define CPM_LCR_DOZE_ON (1 << 2) +#define CPM_LCR_LPM_BIT 0 +#define CPM_LCR_LPM_MASK (0x3 << CPM_LCR_LPM_BIT) + #define CPM_LCR_LPM_IDLE (0x0 << CPM_LCR_LPM_BIT) + #define CPM_LCR_LPM_SLEEP (0x1 << CPM_LCR_LPM_BIT) + +/* Clock Gate Register */ +#define CPM_CLKGR_UART1 (1 << 15) +#define CPM_CLKGR_UHC (1 << 14) +#define CPM_CLKGR_IPU (1 << 13) +#define CPM_CLKGR_DMAC (1 << 12) +#define CPM_CLKGR_UDC (1 << 11) +#define CPM_CLKGR_LCD (1 << 10) +#define CPM_CLKGR_CIM (1 << 9) +#define CPM_CLKGR_SADC (1 << 8) +#define CPM_CLKGR_MSC (1 << 7) +#define CPM_CLKGR_AIC1 (1 << 6) +#define CPM_CLKGR_AIC2 (1 << 5) +#define CPM_CLKGR_SSI (1 << 4) +#define CPM_CLKGR_I2C (1 << 3) +#define CPM_CLKGR_RTC (1 << 2) +#define CPM_CLKGR_TCU (1 << 1) +#define CPM_CLKGR_UART0 (1 << 0) + +/* Sleep Control Register */ +#define CPM_SCR_O1ST_BIT 8 +#define CPM_SCR_O1ST_MASK (0xff << CPM_SCR_O1ST_BIT) +#define CPM_SCR_USBHOST_SUSPEND (1 << 7) +#define CPM_SCR_USBPHY_ENABLE (1 << 6) +#define CPM_SCR_OSC_ENABLE (1 << 4) + +/* Hibernate Control Register */ +#define CPM_HCR_PD (1 << 0) + +/* Wakeup Filter Counter Register in Hibernate Mode */ +#define CPM_HWFCR_TIME_BIT 0 +#define CPM_HWFCR_TIME_MASK (0x3ff << CPM_HWFCR_TIME_BIT) + +/* Reset Counter Register in Hibernate Mode */ +#define CPM_HRCR_TIME_BIT 0 +#define CPM_HRCR_TIME_MASK (0x7f << CPM_HRCR_TIME_BIT) + +/* Wakeup Control Register in Hibernate Mode */ +#define CPM_HWCR_WLE_LOW (0 << 2) +#define CPM_HWCR_WLE_HIGH (1 << 2) +#define CPM_HWCR_PIN_WAKEUP (1 << 1) +#define CPM_HWCR_RTC_WAKEUP (1 << 0) + +/* Wakeup Status Register in Hibernate Mode */ +#define CPM_HWSR_WSR_PIN (1 << 1) +#define CPM_HWSR_WSR_RTC (1 << 0) + +/* Reset Status Register */ +#define CPM_RSR_HR (1 << 2) +#define CPM_RSR_WR (1 << 1) +#define CPM_RSR_PR (1 << 0) + + +/************************************************************************* + * TCU (Timer Counter Unit) + *************************************************************************/ +#define TCU_TSR (TCU_BASE + 0x1C) /* Timer Stop Register */ +#define TCU_TSSR (TCU_BASE + 0x2C) /* Timer Stop Set Register */ +#define TCU_TSCR (TCU_BASE + 0x3C) /* Timer Stop Clear Register */ +#define TCU_TER (TCU_BASE + 0x10) /* Timer Counter Enable Register */ +#define TCU_TESR (TCU_BASE + 0x14) /* Timer Counter Enable Set Register */ +#define TCU_TECR (TCU_BASE + 0x18) /* Timer Counter Enable Clear Register */ +#define TCU_TFR (TCU_BASE + 0x20) /* Timer Flag Register */ +#define TCU_TFSR (TCU_BASE + 0x24) /* Timer Flag Set Register */ +#define TCU_TFCR (TCU_BASE + 0x28) /* Timer Flag Clear Register */ +#define TCU_TMR (TCU_BASE + 0x30) /* Timer Mask Register */ +#define TCU_TMSR (TCU_BASE + 0x34) /* Timer Mask Set Register */ +#define TCU_TMCR (TCU_BASE + 0x38) /* Timer Mask Clear Register */ +#define TCU_TDFR0 (TCU_BASE + 0x40) /* Timer Data Full Register */ +#define TCU_TDHR0 (TCU_BASE + 0x44) /* Timer Data Half Register */ +#define TCU_TCNT0 (TCU_BASE + 0x48) /* Timer Counter Register */ +#define TCU_TCSR0 (TCU_BASE + 0x4C) /* Timer Control Register */ +#define TCU_TDFR1 (TCU_BASE + 0x50) +#define TCU_TDHR1 (TCU_BASE + 0x54) +#define TCU_TCNT1 (TCU_BASE + 0x58) +#define TCU_TCSR1 (TCU_BASE + 0x5C) +#define TCU_TDFR2 (TCU_BASE + 0x60) +#define TCU_TDHR2 (TCU_BASE + 0x64) +#define TCU_TCNT2 (TCU_BASE + 0x68) +#define TCU_TCSR2 (TCU_BASE + 0x6C) +#define TCU_TDFR3 (TCU_BASE + 0x70) +#define TCU_TDHR3 (TCU_BASE + 0x74) +#define TCU_TCNT3 (TCU_BASE + 0x78) +#define TCU_TCSR3 (TCU_BASE + 0x7C) +#define TCU_TDFR4 (TCU_BASE + 0x80) +#define TCU_TDHR4 (TCU_BASE + 0x84) +#define TCU_TCNT4 (TCU_BASE + 0x88) +#define TCU_TCSR4 (TCU_BASE + 0x8C) +#define TCU_TDFR5 (TCU_BASE + 0x90) +#define TCU_TDHR5 (TCU_BASE + 0x94) +#define TCU_TCNT5 (TCU_BASE + 0x98) +#define TCU_TCSR5 (TCU_BASE + 0x9C) + +#define REG_TCU_TSR REG32(TCU_TSR) +#define REG_TCU_TSSR REG32(TCU_TSSR) +#define REG_TCU_TSCR REG32(TCU_TSCR) +#define REG_TCU_TER REG8(TCU_TER) +#define REG_TCU_TESR REG8(TCU_TESR) +#define REG_TCU_TECR REG8(TCU_TECR) +#define REG_TCU_TFR REG32(TCU_TFR) +#define REG_TCU_TFSR REG32(TCU_TFSR) +#define REG_TCU_TFCR REG32(TCU_TFCR) +#define REG_TCU_TMR REG32(TCU_TMR) +#define REG_TCU_TMSR REG32(TCU_TMSR) +#define REG_TCU_TMCR REG32(TCU_TMCR) +#define REG_TCU_TDFR0 REG16(TCU_TDFR0) +#define REG_TCU_TDHR0 REG16(TCU_TDHR0) +#define REG_TCU_TCNT0 REG16(TCU_TCNT0) +#define REG_TCU_TCSR0 REG16(TCU_TCSR0) +#define REG_TCU_TDFR1 REG16(TCU_TDFR1) +#define REG_TCU_TDHR1 REG16(TCU_TDHR1) +#define REG_TCU_TCNT1 REG16(TCU_TCNT1) +#define REG_TCU_TCSR1 REG16(TCU_TCSR1) +#define REG_TCU_TDFR2 REG16(TCU_TDFR2) +#define REG_TCU_TDHR2 REG16(TCU_TDHR2) +#define REG_TCU_TCNT2 REG16(TCU_TCNT2) +#define REG_TCU_TCSR2 REG16(TCU_TCSR2) +#define REG_TCU_TDFR3 REG16(TCU_TDFR3) +#define REG_TCU_TDHR3 REG16(TCU_TDHR3) +#define REG_TCU_TCNT3 REG16(TCU_TCNT3) +#define REG_TCU_TCSR3 REG16(TCU_TCSR3) +#define REG_TCU_TDFR4 REG16(TCU_TDFR4) +#define REG_TCU_TDHR4 REG16(TCU_TDHR4) +#define REG_TCU_TCNT4 REG16(TCU_TCNT4) +#define REG_TCU_TCSR4 REG16(TCU_TCSR4) + +// n = 0,1,2,3,4,5,6,7 +#define TCU_TDFR(n) (TCU_BASE + (0x40 + (n)*0x10)) /* Timer Data Full Reg */ +#define TCU_TDHR(n) (TCU_BASE + (0x44 + (n)*0x10)) /* Timer Data Half Reg */ +#define TCU_TCNT(n) (TCU_BASE + (0x48 + (n)*0x10)) /* Timer Counter Reg */ +#define TCU_TCSR(n) (TCU_BASE + (0x4C + (n)*0x10)) /* Timer Control Reg */ + +#define REG_TCU_TDFR(n) REG16(TCU_TDFR((n))) +#define REG_TCU_TDHR(n) REG16(TCU_TDHR((n))) +#define REG_TCU_TCNT(n) REG16(TCU_TCNT((n))) +#define REG_TCU_TCSR(n) REG16(TCU_TCSR((n))) + +// Register definitions +#define TCU_TCSR_PWM_SD (1 << 9) +#define TCU_TCSR_PWM_INITL_HIGH (1 << 8) +#define TCU_TCSR_PWM_EN (1 << 7) +#define TCU_TCSR_PRESCALE_BIT 3 +#define TCU_TCSR_PRESCALE_MASK (0x7 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE1 (0x0 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE4 (0x1 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE16 (0x2 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE64 (0x3 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE256 (0x4 << TCU_TCSR_PRESCALE_BIT) + #define TCU_TCSR_PRESCALE1024 (0x5 << TCU_TCSR_PRESCALE_BIT) +#define TCU_TCSR_EXT_EN (1 << 2) +#define TCU_TCSR_RTC_EN (1 << 1) +#define TCU_TCSR_PCK_EN (1 << 0) + +#define TCU_TER_TCEN5 (1 << 5) +#define TCU_TER_TCEN4 (1 << 4) +#define TCU_TER_TCEN3 (1 << 3) +#define TCU_TER_TCEN2 (1 << 2) +#define TCU_TER_TCEN1 (1 << 1) +#define TCU_TER_TCEN0 (1 << 0) + +#define TCU_TESR_TCST5 (1 << 5) +#define TCU_TESR_TCST4 (1 << 4) +#define TCU_TESR_TCST3 (1 << 3) +#define TCU_TESR_TCST2 (1 << 2) +#define TCU_TESR_TCST1 (1 << 1) +#define TCU_TESR_TCST0 (1 << 0) + +#define TCU_TECR_TCCL5 (1 << 5) +#define TCU_TECR_TCCL4 (1 << 4) +#define TCU_TECR_TCCL3 (1 << 3) +#define TCU_TECR_TCCL2 (1 << 2) +#define TCU_TECR_TCCL1 (1 << 1) +#define TCU_TECR_TCCL0 (1 << 0) + +#define TCU_TFR_HFLAG5 (1 << 21) +#define TCU_TFR_HFLAG4 (1 << 20) +#define TCU_TFR_HFLAG3 (1 << 19) +#define TCU_TFR_HFLAG2 (1 << 18) +#define TCU_TFR_HFLAG1 (1 << 17) +#define TCU_TFR_HFLAG0 (1 << 16) +#define TCU_TFR_FFLAG5 (1 << 5) +#define TCU_TFR_FFLAG4 (1 << 4) +#define TCU_TFR_FFLAG3 (1 << 3) +#define TCU_TFR_FFLAG2 (1 << 2) +#define TCU_TFR_FFLAG1 (1 << 1) +#define TCU_TFR_FFLAG0 (1 << 0) + +#define TCU_TFSR_HFLAG5 (1 << 21) +#define TCU_TFSR_HFLAG4 (1 << 20) +#define TCU_TFSR_HFLAG3 (1 << 19) +#define TCU_TFSR_HFLAG2 (1 << 18) +#define TCU_TFSR_HFLAG1 (1 << 17) +#define TCU_TFSR_HFLAG0 (1 << 16) +#define TCU_TFSR_FFLAG5 (1 << 5) +#define TCU_TFSR_FFLAG4 (1 << 4) +#define TCU_TFSR_FFLAG3 (1 << 3) +#define TCU_TFSR_FFLAG2 (1 << 2) +#define TCU_TFSR_FFLAG1 (1 << 1) +#define TCU_TFSR_FFLAG0 (1 << 0) + +#define TCU_TFCR_HFLAG5 (1 << 21) +#define TCU_TFCR_HFLAG4 (1 << 20) +#define TCU_TFCR_HFLAG3 (1 << 19) +#define TCU_TFCR_HFLAG2 (1 << 18) +#define TCU_TFCR_HFLAG1 (1 << 17) +#define TCU_TFCR_HFLAG0 (1 << 16) +#define TCU_TFCR_FFLAG5 (1 << 5) +#define TCU_TFCR_FFLAG4 (1 << 4) +#define TCU_TFCR_FFLAG3 (1 << 3) +#define TCU_TFCR_FFLAG2 (1 << 2) +#define TCU_TFCR_FFLAG1 (1 << 1) +#define TCU_TFCR_FFLAG0 (1 << 0) + +#define TCU_TMR_HMASK5 (1 << 21) +#define TCU_TMR_HMASK4 (1 << 20) +#define TCU_TMR_HMASK3 (1 << 19) +#define TCU_TMR_HMASK2 (1 << 18) +#define TCU_TMR_HMASK1 (1 << 17) +#define TCU_TMR_HMASK0 (1 << 16) +#define TCU_TMR_FMASK5 (1 << 5) +#define TCU_TMR_FMASK4 (1 << 4) +#define TCU_TMR_FMASK3 (1 << 3) +#define TCU_TMR_FMASK2 (1 << 2) +#define TCU_TMR_FMASK1 (1 << 1) +#define TCU_TMR_FMASK0 (1 << 0) + +#define TCU_TMSR_HMST5 (1 << 21) +#define TCU_TMSR_HMST4 (1 << 20) +#define TCU_TMSR_HMST3 (1 << 19) +#define TCU_TMSR_HMST2 (1 << 18) +#define TCU_TMSR_HMST1 (1 << 17) +#define TCU_TMSR_HMST0 (1 << 16) +#define TCU_TMSR_FMST5 (1 << 5) +#define TCU_TMSR_FMST4 (1 << 4) +#define TCU_TMSR_FMST3 (1 << 3) +#define TCU_TMSR_FMST2 (1 << 2) +#define TCU_TMSR_FMST1 (1 << 1) +#define TCU_TMSR_FMST0 (1 << 0) + +#define TCU_TMCR_HMCL5 (1 << 21) +#define TCU_TMCR_HMCL4 (1 << 20) +#define TCU_TMCR_HMCL3 (1 << 19) +#define TCU_TMCR_HMCL2 (1 << 18) +#define TCU_TMCR_HMCL1 (1 << 17) +#define TCU_TMCR_HMCL0 (1 << 16) +#define TCU_TMCR_FMCL5 (1 << 5) +#define TCU_TMCR_FMCL4 (1 << 4) +#define TCU_TMCR_FMCL3 (1 << 3) +#define TCU_TMCR_FMCL2 (1 << 2) +#define TCU_TMCR_FMCL1 (1 << 1) +#define TCU_TMCR_FMCL0 (1 << 0) + +#define TCU_TSR_WDTS (1 << 16) +#define TCU_TSR_STOP5 (1 << 5) +#define TCU_TSR_STOP4 (1 << 4) +#define TCU_TSR_STOP3 (1 << 3) +#define TCU_TSR_STOP2 (1 << 2) +#define TCU_TSR_STOP1 (1 << 1) +#define TCU_TSR_STOP0 (1 << 0) + +#define TCU_TSSR_WDTSS (1 << 16) +#define TCU_TSSR_STPS5 (1 << 5) +#define TCU_TSSR_STPS4 (1 << 4) +#define TCU_TSSR_STPS3 (1 << 3) +#define TCU_TSSR_STPS2 (1 << 2) +#define TCU_TSSR_STPS1 (1 << 1) +#define TCU_TSSR_STPS0 (1 << 0) + +#define TCU_TSSR_WDTSC (1 << 16) +#define TCU_TSSR_STPC5 (1 << 5) +#define TCU_TSSR_STPC4 (1 << 4) +#define TCU_TSSR_STPC3 (1 << 3) +#define TCU_TSSR_STPC2 (1 << 2) +#define TCU_TSSR_STPC1 (1 << 1) +#define TCU_TSSR_STPC0 (1 << 0) + + +/************************************************************************* + * WDT (WatchDog Timer) + *************************************************************************/ +#define WDT_TDR (WDT_BASE + 0x00) +#define WDT_TCER (WDT_BASE + 0x04) +#define WDT_TCNT (WDT_BASE + 0x08) +#define WDT_TCSR (WDT_BASE + 0x0C) + +#define REG_WDT_TDR REG16(WDT_TDR) +#define REG_WDT_TCER REG8(WDT_TCER) +#define REG_WDT_TCNT REG16(WDT_TCNT) +#define REG_WDT_TCSR REG16(WDT_TCSR) + +// Register definition +#define WDT_TCSR_PRESCALE_BIT 3 +#define WDT_TCSR_PRESCALE_MASK (0x7 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE1 (0x0 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE4 (0x1 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE16 (0x2 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE64 (0x3 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE256 (0x4 << WDT_TCSR_PRESCALE_BIT) + #define WDT_TCSR_PRESCALE1024 (0x5 << WDT_TCSR_PRESCALE_BIT) +#define WDT_TCSR_EXT_EN (1 << 2) +#define WDT_TCSR_RTC_EN (1 << 1) +#define WDT_TCSR_PCK_EN (1 << 0) + +#define WDT_TCER_TCEN (1 << 0) + + +/************************************************************************* + * DMAC (DMA Controller) + *************************************************************************/ + +#define MAX_DMA_NUM 6 /* max 6 channels */ + +#define DMAC_DSAR(n) (DMAC_BASE + (0x00 + (n) * 0x20)) /* DMA source address */ +#define DMAC_DTAR(n) (DMAC_BASE + (0x04 + (n) * 0x20)) /* DMA target address */ +#define DMAC_DTCR(n) (DMAC_BASE + (0x08 + (n) * 0x20)) /* DMA transfer count */ +#define DMAC_DRSR(n) (DMAC_BASE + (0x0c + (n) * 0x20)) /* DMA request source */ +#define DMAC_DCCSR(n) (DMAC_BASE + (0x10 + (n) * 0x20)) /* DMA control/status */ +#define DMAC_DCMD(n) (DMAC_BASE + (0x14 + (n) * 0x20)) /* DMA command */ +#define DMAC_DDA(n) (DMAC_BASE + (0x18 + (n) * 0x20)) /* DMA descriptor address */ +#define DMAC_DMACR (DMAC_BASE + 0x0300) /* DMA control register */ +#define DMAC_DMAIPR (DMAC_BASE + 0x0304) /* DMA interrupt pending */ +#define DMAC_DMADBR (DMAC_BASE + 0x0308) /* DMA doorbell */ +#define DMAC_DMADBSR (DMAC_BASE + 0x030C) /* DMA doorbell set */ + +// channel 0 +#define DMAC_DSAR0 DMAC_DSAR(0) +#define DMAC_DTAR0 DMAC_DTAR(0) +#define DMAC_DTCR0 DMAC_DTCR(0) +#define DMAC_DRSR0 DMAC_DRSR(0) +#define DMAC_DCCSR0 DMAC_DCCSR(0) +#define DMAC_DCMD0 DMAC_DCMD(0) +#define DMAC_DDA0 DMAC_DDA(0) + +// channel 1 +#define DMAC_DSAR1 DMAC_DSAR(1) +#define DMAC_DTAR1 DMAC_DTAR(1) +#define DMAC_DTCR1 DMAC_DTCR(1) +#define DMAC_DRSR1 DMAC_DRSR(1) +#define DMAC_DCCSR1 DMAC_DCCSR(1) +#define DMAC_DCMD1 DMAC_DCMD(1) +#define DMAC_DDA1 DMAC_DDA(1) + +// channel 2 +#define DMAC_DSAR2 DMAC_DSAR(2) +#define DMAC_DTAR2 DMAC_DTAR(2) +#define DMAC_DTCR2 DMAC_DTCR(2) +#define DMAC_DRSR2 DMAC_DRSR(2) +#define DMAC_DCCSR2 DMAC_DCCSR(2) +#define DMAC_DCMD2 DMAC_DCMD(2) +#define DMAC_DDA2 DMAC_DDA(2) + +// channel 3 +#define DMAC_DSAR3 DMAC_DSAR(3) +#define DMAC_DTAR3 DMAC_DTAR(3) +#define DMAC_DTCR3 DMAC_DTCR(3) +#define DMAC_DRSR3 DMAC_DRSR(3) +#define DMAC_DCCSR3 DMAC_DCCSR(3) +#define DMAC_DCMD3 DMAC_DCMD(3) +#define DMAC_DDA3 DMAC_DDA(3) + +// channel 4 +#define DMAC_DSAR4 DMAC_DSAR(4) +#define DMAC_DTAR4 DMAC_DTAR(4) +#define DMAC_DTCR4 DMAC_DTCR(4) +#define DMAC_DRSR4 DMAC_DRSR(4) +#define DMAC_DCCSR4 DMAC_DCCSR(4) +#define DMAC_DCMD4 DMAC_DCMD(4) +#define DMAC_DDA4 DMAC_DDA(4) + +// channel 5 +#define DMAC_DSAR5 DMAC_DSAR(5) +#define DMAC_DTAR5 DMAC_DTAR(5) +#define DMAC_DTCR5 DMAC_DTCR(5) +#define DMAC_DRSR5 DMAC_DRSR(5) +#define DMAC_DCCSR5 DMAC_DCCSR(5) +#define DMAC_DCMD5 DMAC_DCMD(5) +#define DMAC_DDA5 DMAC_DDA(5) + +#define REG_DMAC_DSAR(n) REG32(DMAC_DSAR((n))) +#define REG_DMAC_DTAR(n) REG32(DMAC_DTAR((n))) +#define REG_DMAC_DTCR(n) REG32(DMAC_DTCR((n))) +#define REG_DMAC_DRSR(n) REG32(DMAC_DRSR((n))) +#define REG_DMAC_DCCSR(n) REG32(DMAC_DCCSR((n))) +#define REG_DMAC_DCMD(n) REG32(DMAC_DCMD((n))) +#define REG_DMAC_DDA(n) REG32(DMAC_DDA((n))) +#define REG_DMAC_DMACR REG32(DMAC_DMACR) +#define REG_DMAC_DMAIPR REG32(DMAC_DMAIPR) +#define REG_DMAC_DMADBR REG32(DMAC_DMADBR) +#define REG_DMAC_DMADBSR REG32(DMAC_DMADBSR) + +// DMA request source register +#define DMAC_DRSR_RS_BIT 0 +#define DMAC_DRSR_RS_MASK (0x1f << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_AUTO (8 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_UART0OUT (20 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_UART0IN (21 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_SSIOUT (22 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_SSIIN (23 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_AICOUT (24 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_AICIN (25 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_MSCOUT (26 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_MSCIN (27 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_TCU (28 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_SADC (29 << DMAC_DRSR_RS_BIT) + #define DMAC_DRSR_RS_SLCD (30 << DMAC_DRSR_RS_BIT) + +// DMA channel control/status register +#define DMAC_DCCSR_NDES (1 << 31) /* descriptor (0) or not (1) ? */ +#define DMAC_DCCSR_CDOA_BIT 16 /* copy of DMA offset address */ +#define DMAC_DCCSR_CDOA_MASK (0xff << DMAC_DCCSR_CDOA_BIT) +#define DMAC_DCCSR_INV (1 << 6) /* descriptor invalid */ +#define DMAC_DCCSR_AR (1 << 4) /* address error */ +#define DMAC_DCCSR_TT (1 << 3) /* transfer terminated */ +#define DMAC_DCCSR_HLT (1 << 2) /* DMA halted */ +#define DMAC_DCCSR_CT (1 << 1) /* count terminated */ +#define DMAC_DCCSR_EN (1 << 0) /* channel enable bit */ + +// DMA channel command register +#define DMAC_DCMD_SAI (1 << 23) /* source address increment */ +#define DMAC_DCMD_DAI (1 << 22) /* dest address increment */ +#define DMAC_DCMD_RDIL_BIT 16 /* request detection interval length */ +#define DMAC_DCMD_RDIL_MASK (0x0f << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_IGN (0 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_2 (1 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_4 (2 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_8 (3 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_12 (4 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_16 (5 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_20 (6 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_24 (7 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_28 (8 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_32 (9 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_48 (10 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_60 (11 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_64 (12 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_124 (13 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_128 (14 << DMAC_DCMD_RDIL_BIT) + #define DMAC_DCMD_RDIL_200 (15 << DMAC_DCMD_RDIL_BIT) +#define DMAC_DCMD_SWDH_BIT 14 /* source port width */ +#define DMAC_DCMD_SWDH_MASK (0x03 << DMAC_DCMD_SWDH_BIT) + #define DMAC_DCMD_SWDH_32 (0 << DMAC_DCMD_SWDH_BIT) + #define DMAC_DCMD_SWDH_8 (1 << DMAC_DCMD_SWDH_BIT) + #define DMAC_DCMD_SWDH_16 (2 << DMAC_DCMD_SWDH_BIT) +#define DMAC_DCMD_DWDH_BIT 12 /* dest port width */ +#define DMAC_DCMD_DWDH_MASK (0x03 << DMAC_DCMD_DWDH_BIT) + #define DMAC_DCMD_DWDH_32 (0 << DMAC_DCMD_DWDH_BIT) + #define DMAC_DCMD_DWDH_8 (1 << DMAC_DCMD_DWDH_BIT) + #define DMAC_DCMD_DWDH_16 (2 << DMAC_DCMD_DWDH_BIT) +#define DMAC_DCMD_DS_BIT 8 /* transfer data size of a data unit */ +#define DMAC_DCMD_DS_MASK (0x07 << DMAC_DCMD_DS_BIT) + #define DMAC_DCMD_DS_32BIT (0 << DMAC_DCMD_DS_BIT) + #define DMAC_DCMD_DS_8BIT (1 << DMAC_DCMD_DS_BIT) + #define DMAC_DCMD_DS_16BIT (2 << DMAC_DCMD_DS_BIT) + #define DMAC_DCMD_DS_16BYTE (3 << DMAC_DCMD_DS_BIT) + #define DMAC_DCMD_DS_32BYTE (4 << DMAC_DCMD_DS_BIT) +#define DMAC_DCMD_TM (1 << 7) /* transfer mode: 0-single 1-block */ +#define DMAC_DCMD_DES_V (1 << 4) /* descriptor valid flag */ +#define DMAC_DCMD_DES_VM (1 << 3) /* descriptor valid mask: 1:support V-bit */ +#define DMAC_DCMD_DES_VIE (1 << 2) /* DMA valid error interrupt enable */ +#define DMAC_DCMD_TIE (1 << 1) /* DMA transfer interrupt enable */ +#define DMAC_DCMD_LINK (1 << 0) /* descriptor link enable */ + +// DMA descriptor address register +#define DMAC_DDA_BASE_BIT 12 /* descriptor base address */ +#define DMAC_DDA_BASE_MASK (0x0fffff << DMAC_DDA_BASE_BIT) +#define DMAC_DDA_OFFSET_BIT 4 /* descriptor offset address */ +#define DMAC_DDA_OFFSET_MASK (0x0ff << DMAC_DDA_OFFSET_BIT) + +// DMA control register +#define DMAC_DMACR_PR_BIT 8 /* channel priority mode */ +#define DMAC_DMACR_PR_MASK (0x03 << DMAC_DMACR_PR_BIT) + #define DMAC_DMACR_PR_012345 (0 << DMAC_DMACR_PR_BIT) + #define DMAC_DMACR_PR_023145 (1 << DMAC_DMACR_PR_BIT) + #define DMAC_DMACR_PR_201345 (2 << DMAC_DMACR_PR_BIT) + #define DMAC_DMACR_PR_RR (3 << DMAC_DMACR_PR_BIT) /* round robin */ +#define DMAC_DMACR_HLT (1 << 3) /* DMA halt flag */ +#define DMAC_DMACR_AR (1 << 2) /* address error flag */ +#define DMAC_DMACR_DMAE (1 << 0) /* DMA enable bit */ + +// DMA doorbell register +#define DMAC_DMADBR_DB5 (1 << 5) /* doorbell for channel 5 */ +#define DMAC_DMADBR_DB4 (1 << 5) /* doorbell for channel 4 */ +#define DMAC_DMADBR_DB3 (1 << 5) /* doorbell for channel 3 */ +#define DMAC_DMADBR_DB2 (1 << 5) /* doorbell for channel 2 */ +#define DMAC_DMADBR_DB1 (1 << 5) /* doorbell for channel 1 */ +#define DMAC_DMADBR_DB0 (1 << 5) /* doorbell for channel 0 */ + +// DMA doorbell set register +#define DMAC_DMADBSR_DBS5 (1 << 5) /* enable doorbell for channel 5 */ +#define DMAC_DMADBSR_DBS4 (1 << 5) /* enable doorbell for channel 4 */ +#define DMAC_DMADBSR_DBS3 (1 << 5) /* enable doorbell for channel 3 */ +#define DMAC_DMADBSR_DBS2 (1 << 5) /* enable doorbell for channel 2 */ +#define DMAC_DMADBSR_DBS1 (1 << 5) /* enable doorbell for channel 1 */ +#define DMAC_DMADBSR_DBS0 (1 << 5) /* enable doorbell for channel 0 */ + +// DMA interrupt pending register +#define DMAC_DMAIPR_CIRQ5 (1 << 5) /* irq pending status for channel 5 */ +#define DMAC_DMAIPR_CIRQ4 (1 << 4) /* irq pending status for channel 4 */ +#define DMAC_DMAIPR_CIRQ3 (1 << 3) /* irq pending status for channel 3 */ +#define DMAC_DMAIPR_CIRQ2 (1 << 2) /* irq pending status for channel 2 */ +#define DMAC_DMAIPR_CIRQ1 (1 << 1) /* irq pending status for channel 1 */ +#define DMAC_DMAIPR_CIRQ0 (1 << 0) /* irq pending status for channel 0 */ + + +/************************************************************************* + * GPIO (General-Purpose I/O Ports) + *************************************************************************/ +#define MAX_GPIO_NUM 128 + +//n = 0,1,2,3 +#define GPIO_PXPIN(n) (GPIO_BASE + (0x00 + (n)*0x100)) /* PIN Level Register */ +#define GPIO_PXDAT(n) (GPIO_BASE + (0x10 + (n)*0x100)) /* Port Data Register */ +#define GPIO_PXDATS(n) (GPIO_BASE + (0x14 + (n)*0x100)) /* Port Data Set Register */ +#define GPIO_PXDATC(n) (GPIO_BASE + (0x18 + (n)*0x100)) /* Port Data Clear Register */ +#define GPIO_PXIM(n) (GPIO_BASE + (0x20 + (n)*0x100)) /* Interrupt Mask Register */ +#define GPIO_PXIMS(n) (GPIO_BASE + (0x24 + (n)*0x100)) /* Interrupt Mask Set Reg */ +#define GPIO_PXIMC(n) (GPIO_BASE + (0x28 + (n)*0x100)) /* Interrupt Mask Clear Reg */ +#define GPIO_PXPE(n) (GPIO_BASE + (0x30 + (n)*0x100)) /* Pull Enable Register */ +#define GPIO_PXPES(n) (GPIO_BASE + (0x34 + (n)*0x100)) /* Pull Enable Set Reg. */ +#define GPIO_PXPEC(n) (GPIO_BASE + (0x38 + (n)*0x100)) /* Pull Enable Clear Reg. */ +#define GPIO_PXFUN(n) (GPIO_BASE + (0x40 + (n)*0x100)) /* Function Register */ +#define GPIO_PXFUNS(n) (GPIO_BASE + (0x44 + (n)*0x100)) /* Function Set Register */ +#define GPIO_PXFUNC(n) (GPIO_BASE + (0x48 + (n)*0x100)) /* Function Clear Register */ +#define GPIO_PXSEL(n) (GPIO_BASE + (0x50 + (n)*0x100)) /* Select Register */ +#define GPIO_PXSELS(n) (GPIO_BASE + (0x54 + (n)*0x100)) /* Select Set Register */ +#define GPIO_PXSELC(n) (GPIO_BASE + (0x58 + (n)*0x100)) /* Select Clear Register */ +#define GPIO_PXDIR(n) (GPIO_BASE + (0x60 + (n)*0x100)) /* Direction Register */ +#define GPIO_PXDIRS(n) (GPIO_BASE + (0x64 + (n)*0x100)) /* Direction Set Register */ +#define GPIO_PXDIRC(n) (GPIO_BASE + (0x68 + (n)*0x100)) /* Direction Clear Register */ +#define GPIO_PXTRG(n) (GPIO_BASE + (0x70 + (n)*0x100)) /* Trigger Register */ +#define GPIO_PXTRGS(n) (GPIO_BASE + (0x74 + (n)*0x100)) /* Trigger Set Register */ +#define GPIO_PXTRGC(n) (GPIO_BASE + (0x78 + (n)*0x100)) /* Trigger Set Register */ +#define GPIO_PXFLG(n) (GPIO_BASE + (0x80 + (n)*0x100)) /* Port Flag Register */ +#define GPIO_PXFLGC(n) (GPIO_BASE + (0x14 + (n)*0x100)) /* Port Flag clear Register */ + +#define REG_GPIO_PXPIN(n) REG32(GPIO_PXPIN((n))) /* PIN level */ +#define REG_GPIO_PXDAT(n) REG32(GPIO_PXDAT((n))) /* 1: interrupt pending */ +#define REG_GPIO_PXDATS(n) REG32(GPIO_PXDATS((n))) +#define REG_GPIO_PXDATC(n) REG32(GPIO_PXDATC((n))) +#define REG_GPIO_PXIM(n) REG32(GPIO_PXIM((n))) /* 1: mask pin interrupt */ +#define REG_GPIO_PXIMS(n) REG32(GPIO_PXIMS((n))) +#define REG_GPIO_PXIMC(n) REG32(GPIO_PXIMC((n))) +#define REG_GPIO_PXPE(n) REG32(GPIO_PXPE((n))) /* 1: disable pull up/down */ +#define REG_GPIO_PXPES(n) REG32(GPIO_PXPES((n))) +#define REG_GPIO_PXPEC(n) REG32(GPIO_PXPEC((n))) +#define REG_GPIO_PXFUN(n) REG32(GPIO_PXFUN((n))) /* 0:GPIO or intr, 1:FUNC */ +#define REG_GPIO_PXFUNS(n) REG32(GPIO_PXFUNS((n))) +#define REG_GPIO_PXFUNC(n) REG32(GPIO_PXFUNC((n))) +#define REG_GPIO_PXSEL(n) REG32(GPIO_PXSEL((n))) /* 0:GPIO/Fun0,1:intr/fun1*/ +#define REG_GPIO_PXSELS(n) REG32(GPIO_PXSELS((n))) +#define REG_GPIO_PXSELC(n) REG32(GPIO_PXSELC((n))) +#define REG_GPIO_PXDIR(n) REG32(GPIO_PXDIR((n))) /* 0:input/low-level-trig/falling-edge-trig, 1:output/high-level-trig/rising-edge-trig */ +#define REG_GPIO_PXDIRS(n) REG32(GPIO_PXDIRS((n))) +#define REG_GPIO_PXDIRC(n) REG32(GPIO_PXDIRC((n))) +#define REG_GPIO_PXTRG(n) REG32(GPIO_PXTRG((n))) /* 0:level-trigger, 1:edge-trigger */ +#define REG_GPIO_PXTRGS(n) REG32(GPIO_PXTRGS((n))) +#define REG_GPIO_PXTRGC(n) REG32(GPIO_PXTRGC((n))) +#define REG_GPIO_PXFLG(n) REG32(GPIO_PXFLG((n))) /* interrupt flag */ +#define REG_GPIO_PXFLGC(n) REG32(GPIO_PXFLGC((n))) /* interrupt flag */ + + +/************************************************************************* + * UART + *************************************************************************/ + +#define IRDA_BASE UART0_BASE +#define UART_BASE UART0_BASE +#define UART_OFF 0x1000 + +/* Register Offset */ +#define OFF_RDR (0x00) /* R 8b H'xx */ +#define OFF_TDR (0x00) /* W 8b H'xx */ +#define OFF_DLLR (0x00) /* RW 8b H'00 */ +#define OFF_DLHR (0x04) /* RW 8b H'00 */ +#define OFF_IER (0x04) /* RW 8b H'00 */ +#define OFF_ISR (0x08) /* R 8b H'01 */ +#define OFF_FCR (0x08) /* W 8b H'00 */ +#define OFF_LCR (0x0C) /* RW 8b H'00 */ +#define OFF_MCR (0x10) /* RW 8b H'00 */ +#define OFF_LSR (0x14) /* R 8b H'00 */ +#define OFF_MSR (0x18) /* R 8b H'00 */ +#define OFF_SPR (0x1C) /* RW 8b H'00 */ +#define OFF_SIRCR (0x20) /* RW 8b H'00, UART0 */ +#define OFF_UMR (0x24) /* RW 8b H'00, UART M Register */ +#define OFF_UACR (0x28) /* RW 8b H'00, UART Add Cycle Register */ + +/* Register Address */ +#define UART0_RDR (UART0_BASE + OFF_RDR) +#define UART0_TDR (UART0_BASE + OFF_TDR) +#define UART0_DLLR (UART0_BASE + OFF_DLLR) +#define UART0_DLHR (UART0_BASE + OFF_DLHR) +#define UART0_IER (UART0_BASE + OFF_IER) +#define UART0_ISR (UART0_BASE + OFF_ISR) +#define UART0_FCR (UART0_BASE + OFF_FCR) +#define UART0_LCR (UART0_BASE + OFF_LCR) +#define UART0_MCR (UART0_BASE + OFF_MCR) +#define UART0_LSR (UART0_BASE + OFF_LSR) +#define UART0_MSR (UART0_BASE + OFF_MSR) +#define UART0_SPR (UART0_BASE + OFF_SPR) +#define UART0_SIRCR (UART0_BASE + OFF_SIRCR) +#define UART0_UMR (UART0_BASE + OFF_UMR) +#define UART0_UACR (UART0_BASE + OFF_UACR) + +/* + * Define macros for UART_IER + * UART Interrupt Enable Register + */ +#define UART_IER_RIE (1 << 0) /* 0: receive fifo "full" interrupt disable */ +#define UART_IER_TIE (1 << 1) /* 0: transmit fifo "empty" interrupt disable */ +#define UART_IER_RLIE (1 << 2) /* 0: receive line status interrupt disable */ +#define UART_IER_MIE (1 << 3) /* 0: modem status interrupt disable */ +#define UART_IER_RTIE (1 << 4) /* 0: receive timeout interrupt disable */ + +/* + * Define macros for UART_ISR + * UART Interrupt Status Register + */ +#define UART_ISR_IP (1 << 0) /* 0: interrupt is pending 1: no interrupt */ +#define UART_ISR_IID (7 << 1) /* Source of Interrupt */ +#define UART_ISR_IID_MSI (0 << 1) /* Modem status interrupt */ +#define UART_ISR_IID_THRI (1 << 1) /* Transmitter holding register empty */ +#define UART_ISR_IID_RDI (2 << 1) /* Receiver data interrupt */ +#define UART_ISR_IID_RLSI (3 << 1) /* Receiver line status interrupt */ +#define UART_ISR_FFMS (3 << 6) /* FIFO mode select, set when UART_FCR.FE is set to 1 */ +#define UART_ISR_FFMS_NO_FIFO (0 << 6) +#define UART_ISR_FFMS_FIFO_MODE (3 << 6) + +/* + * Define macros for UART_FCR + * UART FIFO Control Register + */ +#define UART_FCR_FE (1 << 0) /* 0: non-FIFO mode 1: FIFO mode */ +#define UART_FCR_RFLS (1 << 1) /* write 1 to flush receive FIFO */ +#define UART_FCR_TFLS (1 << 2) /* write 1 to flush transmit FIFO */ +#define UART_FCR_DMS (1 << 3) /* 0: disable DMA mode */ +#define UART_FCR_UUE (1 << 4) /* 0: disable UART */ +#define UART_FCR_RTRG (3 << 6) /* Receive FIFO Data Trigger */ +#define UART_FCR_RTRG_1 (0 << 6) +#define UART_FCR_RTRG_4 (1 << 6) +#define UART_FCR_RTRG_8 (2 << 6) +#define UART_FCR_RTRG_15 (3 << 6) + +/* + * Define macros for UART_LCR + * UART Line Control Register + */ +#define UART_LCR_WLEN (3 << 0) /* word length */ +#define UART_LCR_WLEN_5 (0 << 0) +#define UART_LCR_WLEN_6 (1 << 0) +#define UART_LCR_WLEN_7 (2 << 0) +#define UART_LCR_WLEN_8 (3 << 0) +#define UART_LCR_STOP (1 << 2) /* 0: 1 stop bit when word length is 5,6,7,8 + 1: 1.5 stop bits when 5; 2 stop bits when 6,7,8 */ +#define UART_LCR_STOP_1 (0 << 2) /* 0: 1 stop bit when word length is 5,6,7,8 + 1: 1.5 stop bits when 5; 2 stop bits when 6,7,8 */ +#define UART_LCR_STOP_2 (1 << 2) /* 0: 1 stop bit when word length is 5,6,7,8 + 1: 1.5 stop bits when 5; 2 stop bits when 6,7,8 */ + +#define UART_LCR_PE (1 << 3) /* 0: parity disable */ +#define UART_LCR_PROE (1 << 4) /* 0: even parity 1: odd parity */ +#define UART_LCR_SPAR (1 << 5) /* 0: sticky parity disable */ +#define UART_LCR_SBRK (1 << 6) /* write 0 normal, write 1 send break */ +#define UART_LCR_DLAB (1 << 7) /* 0: access UART_RDR/TDR/IER 1: access UART_DLLR/DLHR */ + +/* + * Define macros for UART_LSR + * UART Line Status Register + */ +#define UART_LSR_DR (1 << 0) /* 0: receive FIFO is empty 1: receive data is ready */ +#define UART_LSR_ORER (1 << 1) /* 0: no overrun error */ +#define UART_LSR_PER (1 << 2) /* 0: no parity error */ +#define UART_LSR_FER (1 << 3) /* 0; no framing error */ +#define UART_LSR_BRK (1 << 4) /* 0: no break detected 1: receive a break signal */ +#define UART_LSR_TDRQ (1 << 5) /* 1: transmit FIFO half "empty" */ +#define UART_LSR_TEMT (1 << 6) /* 1: transmit FIFO and shift registers empty */ +#define UART_LSR_RFER (1 << 7) /* 0: no receive error 1: receive error in FIFO mode */ + +/* + * Define macros for UART_MCR + * UART Modem Control Register + */ +#define UART_MCR_DTR (1 << 0) /* 0: DTR_ ouput high */ +#define UART_MCR_RTS (1 << 1) /* 0: RTS_ output high */ +#define UART_MCR_OUT1 (1 << 2) /* 0: UART_MSR.RI is set to 0 and RI_ input high */ +#define UART_MCR_OUT2 (1 << 3) /* 0: UART_MSR.DCD is set to 0 and DCD_ input high */ +#define UART_MCR_LOOP (1 << 4) /* 0: normal 1: loopback mode */ +#define UART_MCR_MCE (1 << 7) /* 0: modem function is disable */ + +/* + * Define macros for UART_MSR + * UART Modem Status Register + */ +#define UART_MSR_DCTS (1 << 0) /* 0: no change on CTS_ pin since last read of UART_MSR */ +#define UART_MSR_DDSR (1 << 1) /* 0: no change on DSR_ pin since last read of UART_MSR */ +#define UART_MSR_DRI (1 << 2) /* 0: no change on RI_ pin since last read of UART_MSR */ +#define UART_MSR_DDCD (1 << 3) /* 0: no change on DCD_ pin since last read of UART_MSR */ +#define UART_MSR_CTS (1 << 4) /* 0: CTS_ pin is high */ +#define UART_MSR_DSR (1 << 5) /* 0: DSR_ pin is high */ +#define UART_MSR_RI (1 << 6) /* 0: RI_ pin is high */ +#define UART_MSR_DCD (1 << 7) /* 0: DCD_ pin is high */ + +/* + * Define macros for SIRCR + * Slow IrDA Control Register + */ +#define SIRCR_TSIRE (1 << 0) /* 0: transmitter is in UART mode 1: IrDA mode */ +#define SIRCR_RSIRE (1 << 1) /* 0: receiver is in UART mode 1: IrDA mode */ +#define SIRCR_TPWS (1 << 2) /* 0: transmit 0 pulse width is 3/16 of bit length + 1: 0 pulse width is 1.6us for 115.2Kbps */ +#define SIRCR_TXPL (1 << 3) /* 0: encoder generates a positive pulse for 0 */ +#define SIRCR_RXPL (1 << 4) /* 0: decoder interprets positive pulse as 0 */ + + +/************************************************************************* + * AIC (AC97/I2S Controller) + *************************************************************************/ +#define AIC_FR (AIC_BASE + 0x000) +#define AIC_CR (AIC_BASE + 0x004) +#define AIC_ACCR1 (AIC_BASE + 0x008) +#define AIC_ACCR2 (AIC_BASE + 0x00C) +#define AIC_I2SCR (AIC_BASE + 0x010) +#define AIC_SR (AIC_BASE + 0x014) +#define AIC_ACSR (AIC_BASE + 0x018) +#define AIC_I2SSR (AIC_BASE + 0x01C) +#define AIC_ACCAR (AIC_BASE + 0x020) +#define AIC_ACCDR (AIC_BASE + 0x024) +#define AIC_ACSAR (AIC_BASE + 0x028) +#define AIC_ACSDR (AIC_BASE + 0x02C) +#define AIC_I2SDIV (AIC_BASE + 0x030) +#define AIC_DR (AIC_BASE + 0x034) + +#define REG_AIC_FR REG32(AIC_FR) +#define REG_AIC_CR REG32(AIC_CR) +#define REG_AIC_ACCR1 REG32(AIC_ACCR1) +#define REG_AIC_ACCR2 REG32(AIC_ACCR2) +#define REG_AIC_I2SCR REG32(AIC_I2SCR) +#define REG_AIC_SR REG32(AIC_SR) +#define REG_AIC_ACSR REG32(AIC_ACSR) +#define REG_AIC_I2SSR REG32(AIC_I2SSR) +#define REG_AIC_ACCAR REG32(AIC_ACCAR) +#define REG_AIC_ACCDR REG32(AIC_ACCDR) +#define REG_AIC_ACSAR REG32(AIC_ACSAR) +#define REG_AIC_ACSDR REG32(AIC_ACSDR) +#define REG_AIC_I2SDIV REG32(AIC_I2SDIV) +#define REG_AIC_DR REG32(AIC_DR) + +/* AIC Controller Configuration Register (AIC_FR) */ + +#define AIC_FR_RFTH_BIT 12 /* Receive FIFO Threshold */ +#define AIC_FR_RFTH_MASK (0xf << AIC_FR_RFTH_BIT) +#define AIC_FR_TFTH_BIT 8 /* Transmit FIFO Threshold */ +#define AIC_FR_TFTH_MASK (0xf << AIC_FR_TFTH_BIT) +#define AIC_FR_ICDC (1 << 5) /* External(0) or Internal CODEC(1) */ +#define AIC_FR_AUSEL (1 << 4) /* AC97(0) or I2S/MSB-justified(1) */ +#define AIC_FR_RST (1 << 3) /* AIC registers reset */ +#define AIC_FR_BCKD (1 << 2) /* I2S BIT_CLK direction, 0:input,1:output */ +#define AIC_FR_SYNCD (1 << 1) /* I2S SYNC direction, 0:input,1:output */ +#define AIC_FR_ENB (1 << 0) /* AIC enable bit */ + +/* AIC Controller Common Control Register (AIC_CR) */ + +#define AIC_CR_OSS_BIT 19 /* Output Sample Size from memory (AIC V2 only) */ +#define AIC_CR_OSS_MASK (0x7 << AIC_CR_OSS_BIT) + #define AIC_CR_OSS_8BIT (0x0 << AIC_CR_OSS_BIT) + #define AIC_CR_OSS_16BIT (0x1 << AIC_CR_OSS_BIT) + #define AIC_CR_OSS_18BIT (0x2 << AIC_CR_OSS_BIT) + #define AIC_CR_OSS_20BIT (0x3 << AIC_CR_OSS_BIT) + #define AIC_CR_OSS_24BIT (0x4 << AIC_CR_OSS_BIT) +#define AIC_CR_ISS_BIT 16 /* Input Sample Size from memory (AIC V2 only) */ +#define AIC_CR_ISS_MASK (0x7 << AIC_CR_ISS_BIT) + #define AIC_CR_ISS_8BIT (0x0 << AIC_CR_ISS_BIT) + #define AIC_CR_ISS_16BIT (0x1 << AIC_CR_ISS_BIT) + #define AIC_CR_ISS_18BIT (0x2 << AIC_CR_ISS_BIT) + #define AIC_CR_ISS_20BIT (0x3 << AIC_CR_ISS_BIT) + #define AIC_CR_ISS_24BIT (0x4 << AIC_CR_ISS_BIT) +#define AIC_CR_RDMS (1 << 15) /* Receive DMA enable */ +#define AIC_CR_TDMS (1 << 14) /* Transmit DMA enable */ +#define AIC_CR_M2S (1 << 11) /* Mono to Stereo enable */ +#define AIC_CR_ENDSW (1 << 10) /* Endian switch enable */ +#define AIC_CR_AVSTSU (1 << 9) /* Signed <-> Unsigned toggle enable */ +#define AIC_CR_FLUSH (1 << 8) /* Flush FIFO */ +#define AIC_CR_EROR (1 << 6) /* Enable ROR interrupt */ +#define AIC_CR_ETUR (1 << 5) /* Enable TUR interrupt */ +#define AIC_CR_ERFS (1 << 4) /* Enable RFS interrupt */ +#define AIC_CR_ETFS (1 << 3) /* Enable TFS interrupt */ +#define AIC_CR_ENLBF (1 << 2) /* Enable Loopback Function */ +#define AIC_CR_ERPL (1 << 1) /* Enable Playback Function */ +#define AIC_CR_EREC (1 << 0) /* Enable Record Function */ + +/* AIC Controller AC-link Control Register 1 (AIC_ACCR1) */ + +#define AIC_ACCR1_RS_BIT 16 /* Receive Valid Slots */ +#define AIC_ACCR1_RS_MASK (0x3ff << AIC_ACCR1_RS_BIT) + #define AIC_ACCR1_RS_SLOT12 (1 << 25) /* Slot 12 valid bit */ + #define AIC_ACCR1_RS_SLOT11 (1 << 24) /* Slot 11 valid bit */ + #define AIC_ACCR1_RS_SLOT10 (1 << 23) /* Slot 10 valid bit */ + #define AIC_ACCR1_RS_SLOT9 (1 << 22) /* Slot 9 valid bit, LFE */ + #define AIC_ACCR1_RS_SLOT8 (1 << 21) /* Slot 8 valid bit, Surround Right */ + #define AIC_ACCR1_RS_SLOT7 (1 << 20) /* Slot 7 valid bit, Surround Left */ + #define AIC_ACCR1_RS_SLOT6 (1 << 19) /* Slot 6 valid bit, PCM Center */ + #define AIC_ACCR1_RS_SLOT5 (1 << 18) /* Slot 5 valid bit */ + #define AIC_ACCR1_RS_SLOT4 (1 << 17) /* Slot 4 valid bit, PCM Right */ + #define AIC_ACCR1_RS_SLOT3 (1 << 16) /* Slot 3 valid bit, PCM Left */ +#define AIC_ACCR1_XS_BIT 0 /* Transmit Valid Slots */ +#define AIC_ACCR1_XS_MASK (0x3ff << AIC_ACCR1_XS_BIT) + #define AIC_ACCR1_XS_SLOT12 (1 << 9) /* Slot 12 valid bit */ + #define AIC_ACCR1_XS_SLOT11 (1 << 8) /* Slot 11 valid bit */ + #define AIC_ACCR1_XS_SLOT10 (1 << 7) /* Slot 10 valid bit */ + #define AIC_ACCR1_XS_SLOT9 (1 << 6) /* Slot 9 valid bit, LFE */ + #define AIC_ACCR1_XS_SLOT8 (1 << 5) /* Slot 8 valid bit, Surround Right */ + #define AIC_ACCR1_XS_SLOT7 (1 << 4) /* Slot 7 valid bit, Surround Left */ + #define AIC_ACCR1_XS_SLOT6 (1 << 3) /* Slot 6 valid bit, PCM Center */ + #define AIC_ACCR1_XS_SLOT5 (1 << 2) /* Slot 5 valid bit */ + #define AIC_ACCR1_XS_SLOT4 (1 << 1) /* Slot 4 valid bit, PCM Right */ + #define AIC_ACCR1_XS_SLOT3 (1 << 0) /* Slot 3 valid bit, PCM Left */ + +/* AIC Controller AC-link Control Register 2 (AIC_ACCR2) */ + +#define AIC_ACCR2_ERSTO (1 << 18) /* Enable RSTO interrupt */ +#define AIC_ACCR2_ESADR (1 << 17) /* Enable SADR interrupt */ +#define AIC_ACCR2_ECADT (1 << 16) /* Enable CADT interrupt */ +#define AIC_ACCR2_OASS_BIT 8 /* Output Sample Size for AC-link */ +#define AIC_ACCR2_OASS_MASK (0x3 << AIC_ACCR2_OASS_BIT) + #define AIC_ACCR2_OASS_20BIT (0 << AIC_ACCR2_OASS_BIT) /* Output Audio Sample Size is 20-bit */ + #define AIC_ACCR2_OASS_18BIT (1 << AIC_ACCR2_OASS_BIT) /* Output Audio Sample Size is 18-bit */ + #define AIC_ACCR2_OASS_16BIT (2 << AIC_ACCR2_OASS_BIT) /* Output Audio Sample Size is 16-bit */ + #define AIC_ACCR2_OASS_8BIT (3 << AIC_ACCR2_OASS_BIT) /* Output Audio Sample Size is 8-bit */ +#define AIC_ACCR2_IASS_BIT 6 /* Output Sample Size for AC-link */ +#define AIC_ACCR2_IASS_MASK (0x3 << AIC_ACCR2_IASS_BIT) + #define AIC_ACCR2_IASS_20BIT (0 << AIC_ACCR2_IASS_BIT) /* Input Audio Sample Size is 20-bit */ + #define AIC_ACCR2_IASS_18BIT (1 << AIC_ACCR2_IASS_BIT) /* Input Audio Sample Size is 18-bit */ + #define AIC_ACCR2_IASS_16BIT (2 << AIC_ACCR2_IASS_BIT) /* Input Audio Sample Size is 16-bit */ + #define AIC_ACCR2_IASS_8BIT (3 << AIC_ACCR2_IASS_BIT) /* Input Audio Sample Size is 8-bit */ +#define AIC_ACCR2_SO (1 << 3) /* SDATA_OUT output value */ +#define AIC_ACCR2_SR (1 << 2) /* RESET# pin level */ +#define AIC_ACCR2_SS (1 << 1) /* SYNC pin level */ +#define AIC_ACCR2_SA (1 << 0) /* SYNC and SDATA_OUT alternation */ + +/* AIC Controller I2S/MSB-justified Control Register (AIC_I2SCR) */ + +#define AIC_I2SCR_STPBK (1 << 12) /* Stop BIT_CLK for I2S/MSB-justified */ +#define AIC_I2SCR_WL_BIT 1 /* Input/Output Sample Size for I2S/MSB-justified */ +#define AIC_I2SCR_WL_MASK (0x7 << AIC_I2SCR_WL_BIT) + #define AIC_I2SCR_WL_24BIT (0 << AIC_I2SCR_WL_BIT) /* Word Length is 24 bit */ + #define AIC_I2SCR_WL_20BIT (1 << AIC_I2SCR_WL_BIT) /* Word Length is 20 bit */ + #define AIC_I2SCR_WL_18BIT (2 << AIC_I2SCR_WL_BIT) /* Word Length is 18 bit */ + #define AIC_I2SCR_WL_16BIT (3 << AIC_I2SCR_WL_BIT) /* Word Length is 16 bit */ + #define AIC_I2SCR_WL_8BIT (4 << AIC_I2SCR_WL_BIT) /* Word Length is 8 bit */ +#define AIC_I2SCR_AMSL (1 << 0) /* 0:I2S, 1:MSB-justified */ + +/* AIC Controller FIFO Status Register (AIC_SR) */ + +#define AIC_SR_RFL_BIT 24 /* Receive FIFO Level */ +#define AIC_SR_RFL_MASK (0x3f << AIC_SR_RFL_BIT) +#define AIC_SR_TFL_BIT 8 /* Transmit FIFO level */ +#define AIC_SR_TFL_MASK (0x3f << AIC_SR_TFL_BIT) +#define AIC_SR_ROR (1 << 6) /* Receive FIFO Overrun */ +#define AIC_SR_TUR (1 << 5) /* Transmit FIFO Underrun */ +#define AIC_SR_RFS (1 << 4) /* Receive FIFO Service Request */ +#define AIC_SR_TFS (1 << 3) /* Transmit FIFO Service Request */ + +/* AIC Controller AC-link Status Register (AIC_ACSR) */ + +#define AIC_ACSR_SLTERR (1 << 21) /* Slot Error Flag */ +#define AIC_ACSR_CRDY (1 << 20) /* External CODEC Ready Flag */ +#define AIC_ACSR_CLPM (1 << 19) /* External CODEC low power mode flag */ +#define AIC_ACSR_RSTO (1 << 18) /* External CODEC regs read status timeout */ +#define AIC_ACSR_SADR (1 << 17) /* External CODEC regs status addr and data received */ +#define AIC_ACSR_CADT (1 << 16) /* Command Address and Data Transmitted */ + +/* AIC Controller I2S/MSB-justified Status Register (AIC_I2SSR) */ + +#define AIC_I2SSR_BSY (1 << 2) /* AIC Busy in I2S/MSB-justified format */ + +/* AIC Controller AC97 codec Command Address Register (AIC_ACCAR) */ + +#define AIC_ACCAR_CAR_BIT 0 +#define AIC_ACCAR_CAR_MASK (0xfffff << AIC_ACCAR_CAR_BIT) + +/* AIC Controller AC97 codec Command Data Register (AIC_ACCDR) */ + +#define AIC_ACCDR_CDR_BIT 0 +#define AIC_ACCDR_CDR_MASK (0xfffff << AIC_ACCDR_CDR_BIT) + +/* AIC Controller AC97 codec Status Address Register (AIC_ACSAR) */ + +#define AIC_ACSAR_SAR_BIT 0 +#define AIC_ACSAR_SAR_MASK (0xfffff << AIC_ACSAR_SAR_BIT) + +/* AIC Controller AC97 codec Status Data Register (AIC_ACSDR) */ + +#define AIC_ACSDR_SDR_BIT 0 +#define AIC_ACSDR_SDR_MASK (0xfffff << AIC_ACSDR_SDR_BIT) + +/* AIC Controller I2S/MSB-justified Clock Divider Register (AIC_I2SDIV) */ + +#define AIC_I2SDIV_DIV_BIT 0 +#define AIC_I2SDIV_DIV_MASK (0x7f << AIC_I2SDIV_DIV_BIT) + #define AIC_I2SDIV_BITCLK_3072KHZ (0x0C << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 3.072MHz */ + #define AIC_I2SDIV_BITCLK_2836KHZ (0x0D << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 2.836MHz */ + #define AIC_I2SDIV_BITCLK_1418KHZ (0x1A << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 1.418MHz */ + #define AIC_I2SDIV_BITCLK_1024KHZ (0x24 << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 1.024MHz */ + #define AIC_I2SDIV_BITCLK_7089KHZ (0x34 << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 708.92KHz */ + #define AIC_I2SDIV_BITCLK_512KHZ (0x48 << AIC_I2SDIV_DIV_BIT) /* BIT_CLK of 512.00KHz */ + + +/************************************************************************* + * ICDC (Internal CODEC) + *************************************************************************/ +#define ICDC_CR (ICDC_BASE + 0x0400) /* ICDC Control Register */ +#define ICDC_APWAIT (ICDC_BASE + 0x0404) /* Anti-Pop WAIT Stage Timing Control Register */ +#define ICDC_APPRE (ICDC_BASE + 0x0408) /* Anti-Pop HPEN-PRE Stage Timing Control Register */ +#define ICDC_APHPEN (ICDC_BASE + 0x040C) /* Anti-Pop HPEN Stage Timing Control Register */ +#define ICDC_APSR (ICDC_BASE + 0x0410) /* Anti-Pop Status Register */ +#define ICDC_CDCCR1 (ICDC_BASE + 0x0080) +#define ICDC_CDCCR2 (ICDC_BASE + 0x0084) + +#define REG_ICDC_CR REG32(ICDC_CR) +#define REG_ICDC_APWAIT REG32(ICDC_APWAIT) +#define REG_ICDC_APPRE REG32(ICDC_APPRE) +#define REG_ICDC_APHPEN REG32(ICDC_APHPEN) +#define REG_ICDC_APSR REG32(ICDC_APSR) +#define REG_ICDC_CDCCR1 REG32(ICDC_CDCCR1) +#define REG_ICDC_CDCCR2 REG32(ICDC_CDCCR2) + +/* ICDC Control Register */ +#define ICDC_CR_LINVOL_BIT 24 /* LINE Input Volume Gain: GAIN=LINVOL*1.5-34.5 */ +#define ICDC_CR_LINVOL_MASK (0x1f << ICDC_CR_LINVOL_BIT) +#define ICDC_CR_ASRATE_BIT 20 /* Audio Sample Rate */ +#define ICDC_CR_ASRATE_MASK (0x0f << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_8000 (0x0 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_11025 (0x1 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_12000 (0x2 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_16000 (0x3 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_22050 (0x4 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_24000 (0x5 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_32000 (0x6 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_44100 (0x7 << ICDC_CR_ASRATE_BIT) + #define ICDC_CR_ASRATE_48000 (0x8 << ICDC_CR_ASRATE_BIT) +#define ICDC_CR_MICBG_BIT 18 /* MIC Boost Gain */ +#define ICDC_CR_MICBG_MASK (0x3 << ICDC_CR_MICBG_BIT) + #define ICDC_CR_MICBG_0DB (0x0 << ICDC_CR_MICBG_BIT) + #define ICDC_CR_MICBG_6DB (0x1 << ICDC_CR_MICBG_BIT) + #define ICDC_CR_MICBG_12DB (0x2 << ICDC_CR_MICBG_BIT) + #define ICDC_CR_MICBG_20DB (0x3 << ICDC_CR_MICBG_BIT) +#define ICDC_CR_HPVOL_BIT 16 /* Headphone Volume Gain */ +#define ICDC_CR_HPVOL_MASK (0x3 << ICDC_CR_HPVOL_BIT) + #define ICDC_CR_HPVOL_0DB (0x0 << ICDC_CR_HPVOL_BIT) + #define ICDC_CR_HPVOL_2DB (0x1 << ICDC_CR_HPVOL_BIT) + #define ICDC_CR_HPVOL_4DB (0x2 << ICDC_CR_HPVOL_BIT) + #define ICDC_CR_HPVOL_6DB (0x3 << ICDC_CR_HPVOL_BIT) +#define ICDC_CR_ELINEIN (1 << 13) /* Enable LINE Input */ +#define ICDC_CR_EMIC (1 << 12) /* Enable MIC Input */ +#define ICDC_CR_SW1ON (1 << 11) /* Switch 1 in CODEC is on */ +#define ICDC_CR_EADC (1 << 10) /* Enable ADC */ +#define ICDC_CR_SW2ON (1 << 9) /* Switch 2 in CODEC is on */ +#define ICDC_CR_EDAC (1 << 8) /* Enable DAC */ +#define ICDC_CR_HPMUTE (1 << 5) /* Headphone Mute */ +#define ICDC_CR_HPTON (1 << 4) /* Headphone Amplifier Trun On */ +#define ICDC_CR_HPTOFF (1 << 3) /* Headphone Amplifier Trun Off */ +#define ICDC_CR_TAAP (1 << 2) /* Turn Around of the Anti-Pop Procedure */ +#define ICDC_CR_EAP (1 << 1) /* Enable Anti-Pop Procedure */ +#define ICDC_CR_SUSPD (1 << 0) /* CODEC Suspend */ + +/* Anti-Pop WAIT Stage Timing Control Register */ +#define ICDC_APWAIT_WAITSN_BIT 0 +#define ICDC_APWAIT_WAITSN_MASK (0x7ff << ICDC_APWAIT_WAITSN_BIT) + +/* Anti-Pop HPEN-PRE Stage Timing Control Register */ +#define ICDC_APPRE_PRESN_BIT 0 +#define ICDC_APPRE_PRESN_MASK (0x1ff << ICDC_APPRE_PRESN_BIT) + +/* Anti-Pop HPEN Stage Timing Control Register */ +#define ICDC_APHPEN_HPENSN_BIT 0 +#define ICDC_APHPEN_HPENSN_MASK (0x3fff << ICDC_APHPEN_HPENSN_BIT) + +/* Anti-Pop Status Register */ +#define ICDC_SR_HPST_BIT 14 /* Headphone Amplifier State */ +#define ICDC_SR_HPST_MASK (0x7 << ICDC_SR_HPST_BIT) +#define ICDC_SR_HPST_HP_OFF (0x0 << ICDC_SR_HPST_BIT) /* HP amplifier is off */ +#define ICDC_SR_HPST_TON_WAIT (0x1 << ICDC_SR_HPST_BIT) /* wait state in turn-on */ + #define ICDC_SR_HPST_TON_PRE (0x2 << ICDC_SR_HPST_BIT) /* pre-enable state in turn-on */ +#define ICDC_SR_HPST_TON_HPEN (0x3 << ICDC_SR_HPST_BIT) /* HP enable state in turn-on */ + #define ICDC_SR_HPST_TOFF_HPEN (0x4 << ICDC_SR_HPST_BIT) /* HP enable state in turn-off */ + #define ICDC_SR_HPST_TOFF_PRE (0x5 << ICDC_SR_HPST_BIT) /* pre-enable state in turn-off */ + #define ICDC_SR_HPST_TOFF_WAIT (0x6 << ICDC_SR_HPST_BIT) /* wait state in turn-off */ + #define ICDC_SR_HPST_HP_ON (0x7 << ICDC_SR_HPST_BIT) /* HP amplifier is on */ +#define ICDC_SR_SNCNT_BIT 0 /* Sample Number Counter */ +#define ICDC_SR_SNCNT_MASK (0x3fff << ICDC_SR_SNCNT_BIT) + +#define ICDC_CDCCR1_ELININ (1 << 29) +#define ICDC_CDCCR1_EMIC (1 << 28) +#define ICDC_CDCCR1_SW1ON (1 << 27) +#define ICDC_CDCCR1_EADC (1 << 26) +#define ICDC_CDCCR1_SW2ON (1 << 25) +#define ICDC_CDCCR1_EDAC (1 << 24) +#define ICDC_CDCCR1_PDVR (1 << 20) +#define ICDC_CDCCR1_PDVRA (1 << 19) +#define ICDC_CDCCR1_VRPLD (1 << 18) +#define ICDC_CDCCR1_VRCGL (1 << 17) +#define ICDC_CDCCR1_VRCGH (1 << 16) +#define ICDC_CDCCR1_HPMUTE (1 << 14) +#define ICDC_CDCCR1_HPOV0 (1 << 13) +#define ICDC_CDCCR1_HPCG (1 << 12) +#define ICDC_CDCCR1_HPPLDM (1 << 11) +#define ICDC_CDCCR1_HPPLDR (1 << 10) +#define ICDC_CDCCR1_PDHPM (1 << 9) +#define ICDC_CDCCR1_PDHP (1 << 8) +#define ICDC_CDCCR1_SUSPD (1 << 1) +#define ICDC_CDCCR1_RST (1 << 0) + +#define ICDC_CDCCR2_AINVOL(n) ((n & 0x1F) << 16) +#define ICDC_CDCCR2_SMPR(n) ((n & 0xF) << 8) +#define ICDC_CDCCR2_MICBG(n) ((n & 0x3) << 4) +#define ICDC_CDCCR2_HPVOL(n) ((n & 0x3) << 0) + +#define ICDC_CDCCR2_SMPR_8 (0) +#define ICDC_CDCCR2_SMPR_11 (1) +#define ICDC_CDCCR2_SMPR_12 (2) +#define ICDC_CDCCR2_SMPR_16 (3) +#define ICDC_CDCCR2_SMPR_22 (4) +#define ICDC_CDCCR2_SMPR_24 (5) +#define ICDC_CDCCR2_SMPR_32 (6) +#define ICDC_CDCCR2_SMPR_44 (7) +#define ICDC_CDCCR2_SMPR_48 (8) + +#define ICDC_CDCCR2_HPVOL_0 (0) +#define ICDC_CDCCR2_HPVOL_2 (1) +#define ICDC_CDCCR2_HPVOL_4 (2) +#define ICDC_CDCCR2_HPVOL_6 (3) + + +/************************************************************************* + * I2C + *************************************************************************/ +#define I2C_DR (I2C_BASE + 0x000) +#define I2C_CR (I2C_BASE + 0x004) +#define I2C_SR (I2C_BASE + 0x008) +#define I2C_GR (I2C_BASE + 0x00C) + +#define REG_I2C_DR REG8(I2C_DR) +#define REG_I2C_CR REG8(I2C_CR) +#define REG_I2C_SR REG8(I2C_SR) +#define REG_I2C_GR REG16(I2C_GR) + +/* I2C Control Register (I2C_CR) */ + +#define I2C_CR_IEN (1 << 4) +#define I2C_CR_STA (1 << 3) +#define I2C_CR_STO (1 << 2) +#define I2C_CR_AC (1 << 1) +#define I2C_CR_I2CE (1 << 0) + +/* I2C Status Register (I2C_SR) */ + +#define I2C_SR_STX (1 << 4) +#define I2C_SR_BUSY (1 << 3) +#define I2C_SR_TEND (1 << 2) +#define I2C_SR_DRF (1 << 1) +#define I2C_SR_ACKF (1 << 0) + + +/************************************************************************* + * SSI + *************************************************************************/ +#define SSI_DR (SSI_BASE + 0x000) +#define SSI_CR0 (SSI_BASE + 0x004) +#define SSI_CR1 (SSI_BASE + 0x008) +#define SSI_SR (SSI_BASE + 0x00C) +#define SSI_ITR (SSI_BASE + 0x010) +#define SSI_ICR (SSI_BASE + 0x014) +#define SSI_GR (SSI_BASE + 0x018) + +#define REG_SSI_DR REG32(SSI_DR) +#define REG_SSI_CR0 REG16(SSI_CR0) +#define REG_SSI_CR1 REG32(SSI_CR1) +#define REG_SSI_SR REG32(SSI_SR) +#define REG_SSI_ITR REG16(SSI_ITR) +#define REG_SSI_ICR REG8(SSI_ICR) +#define REG_SSI_GR REG16(SSI_GR) + +/* SSI Data Register (SSI_DR) */ + +#define SSI_DR_GPC_BIT 0 +#define SSI_DR_GPC_MASK (0x1ff << SSI_DR_GPC_BIT) + +/* SSI Control Register 0 (SSI_CR0) */ + +#define SSI_CR0_SSIE (1 << 15) +#define SSI_CR0_TIE (1 << 14) +#define SSI_CR0_RIE (1 << 13) +#define SSI_CR0_TEIE (1 << 12) +#define SSI_CR0_REIE (1 << 11) +#define SSI_CR0_LOOP (1 << 10) +#define SSI_CR0_RFINE (1 << 9) +#define SSI_CR0_RFINC (1 << 8) +#define SSI_CR0_FSEL (1 << 6) +#define SSI_CR0_TFLUSH (1 << 2) +#define SSI_CR0_RFLUSH (1 << 1) +#define SSI_CR0_DISREV (1 << 0) + +/* SSI Control Register 1 (SSI_CR1) */ + +#define SSI_CR1_FRMHL_BIT 30 +#define SSI_CR1_FRMHL_MASK (0x3 << SSI_CR1_FRMHL_BIT) + #define SSI_CR1_FRMHL_CELOW_CE2LOW (0 << SSI_CR1_FRMHL_BIT) /* SSI_CE_ is low valid and SSI_CE2_ is low valid */ + #define SSI_CR1_FRMHL_CEHIGH_CE2LOW (1 << SSI_CR1_FRMHL_BIT) /* SSI_CE_ is high valid and SSI_CE2_ is low valid */ + #define SSI_CR1_FRMHL_CELOW_CE2HIGH (2 << SSI_CR1_FRMHL_BIT) /* SSI_CE_ is low valid and SSI_CE2_ is high valid */ + #define SSI_CR1_FRMHL_CEHIGH_CE2HIGH (3 << SSI_CR1_FRMHL_BIT) /* SSI_CE_ is high valid and SSI_CE2_ is high valid */ +#define SSI_CR1_TFVCK_BIT 28 +#define SSI_CR1_TFVCK_MASK (0x3 << SSI_CR1_TFVCK_BIT) + #define SSI_CR1_TFVCK_0 (0 << SSI_CR1_TFVCK_BIT) + #define SSI_CR1_TFVCK_1 (1 << SSI_CR1_TFVCK_BIT) + #define SSI_CR1_TFVCK_2 (2 << SSI_CR1_TFVCK_BIT) + #define SSI_CR1_TFVCK_3 (3 << SSI_CR1_TFVCK_BIT) +#define SSI_CR1_TCKFI_BIT 26 +#define SSI_CR1_TCKFI_MASK (0x3 << SSI_CR1_TCKFI_BIT) + #define SSI_CR1_TCKFI_0 (0 << SSI_CR1_TCKFI_BIT) + #define SSI_CR1_TCKFI_1 (1 << SSI_CR1_TCKFI_BIT) + #define SSI_CR1_TCKFI_2 (2 << SSI_CR1_TCKFI_BIT) + #define SSI_CR1_TCKFI_3 (3 << SSI_CR1_TCKFI_BIT) +#define SSI_CR1_LFST (1 << 25) +#define SSI_CR1_ITFRM (1 << 24) +#define SSI_CR1_UNFIN (1 << 23) +#define SSI_CR1_MULTS (1 << 22) +#define SSI_CR1_FMAT_BIT 20 +#define SSI_CR1_FMAT_MASK (0x3 << SSI_CR1_FMAT_BIT) + #define SSI_CR1_FMAT_SPI (0 << SSI_CR1_FMAT_BIT) /* Motorola¡¯s SPI format */ + #define SSI_CR1_FMAT_SSP (1 << SSI_CR1_FMAT_BIT) /* TI's SSP format */ + #define SSI_CR1_FMAT_MW1 (2 << SSI_CR1_FMAT_BIT) /* National Microwire 1 format */ + #define SSI_CR1_FMAT_MW2 (3 << SSI_CR1_FMAT_BIT) /* National Microwire 2 format */ +#define SSI_CR1_TTRG_BIT 16 +#define SSI_CR1_TTRG_MASK (0xf << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_1 (0 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_8 (1 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_16 (2 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_24 (3 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_32 (4 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_40 (5 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_48 (6 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_56 (7 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_64 (8 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_72 (9 << SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_80 (10<< SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_88 (11<< SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_96 (12<< SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_104 (13<< SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_112 (14<< SSI_CR1_TTRG_BIT) + #define SSI_CR1_TTRG_120 (15<< SSI_CR1_TTRG_BIT) +#define SSI_CR1_MCOM_BIT 12 +#define SSI_CR1_MCOM_MASK (0xf << SSI_CR1_MCOM_BIT) + #define SSI_CR1_MCOM_1BIT (0x0 << SSI_CR1_MCOM_BIT) /* 1-bit command selected */ + #define SSI_CR1_MCOM_2BIT (0x1 << SSI_CR1_MCOM_BIT) /* 2-bit command selected */ + #define SSI_CR1_MCOM_3BIT (0x2 << SSI_CR1_MCOM_BIT) /* 3-bit command selected */ + #define SSI_CR1_MCOM_4BIT (0x3 << SSI_CR1_MCOM_BIT) /* 4-bit command selected */ + #define SSI_CR1_MCOM_5BIT (0x4 << SSI_CR1_MCOM_BIT) /* 5-bit command selected */ + #define SSI_CR1_MCOM_6BIT (0x5 << SSI_CR1_MCOM_BIT) /* 6-bit command selected */ + #define SSI_CR1_MCOM_7BIT (0x6 << SSI_CR1_MCOM_BIT) /* 7-bit command selected */ + #define SSI_CR1_MCOM_8BIT (0x7 << SSI_CR1_MCOM_BIT) /* 8-bit command selected */ + #define SSI_CR1_MCOM_9BIT (0x8 << SSI_CR1_MCOM_BIT) /* 9-bit command selected */ + #define SSI_CR1_MCOM_10BIT (0x9 << SSI_CR1_MCOM_BIT) /* 10-bit command selected */ + #define SSI_CR1_MCOM_11BIT (0xA << SSI_CR1_MCOM_BIT) /* 11-bit command selected */ + #define SSI_CR1_MCOM_12BIT (0xB << SSI_CR1_MCOM_BIT) /* 12-bit command selected */ + #define SSI_CR1_MCOM_13BIT (0xC << SSI_CR1_MCOM_BIT) /* 13-bit command selected */ + #define SSI_CR1_MCOM_14BIT (0xD << SSI_CR1_MCOM_BIT) /* 14-bit command selected */ + #define SSI_CR1_MCOM_15BIT (0xE << SSI_CR1_MCOM_BIT) /* 15-bit command selected */ + #define SSI_CR1_MCOM_16BIT (0xF << SSI_CR1_MCOM_BIT) /* 16-bit command selected */ +#define SSI_CR1_RTRG_BIT 8 +#define SSI_CR1_RTRG_MASK (0xf << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_1 (0 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_8 (1 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_16 (2 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_24 (3 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_32 (4 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_40 (5 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_48 (6 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_56 (7 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_64 (8 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_72 (9 << SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_80 (10<< SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_88 (11<< SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_96 (12<< SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_104 (13<< SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_112 (14<< SSI_CR1_RTRG_BIT) + #define SSI_CR1_RTRG_120 (15<< SSI_CR1_RTRG_BIT) +#define SSI_CR1_FLEN_BIT 4 +#define SSI_CR1_FLEN_MASK (0xf << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_2BIT (0x0 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_3BIT (0x1 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_4BIT (0x2 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_5BIT (0x3 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_6BIT (0x4 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_7BIT (0x5 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_8BIT (0x6 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_9BIT (0x7 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_10BIT (0x8 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_11BIT (0x9 << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_12BIT (0xA << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_13BIT (0xB << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_14BIT (0xC << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_15BIT (0xD << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_16BIT (0xE << SSI_CR1_FLEN_BIT) + #define SSI_CR1_FLEN_17BIT (0xF << SSI_CR1_FLEN_BIT) +#define SSI_CR1_PHA (1 << 1) +#define SSI_CR1_POL (1 << 0) + +/* SSI Status Register (SSI_SR) */ + +#define SSI_SR_TFIFONUM_BIT 16 +#define SSI_SR_TFIFONUM_MASK (0xff << SSI_SR_TFIFONUM_BIT) +#define SSI_SR_RFIFONUM_BIT 8 +#define SSI_SR_RFIFONUM_MASK (0xff << SSI_SR_RFIFONUM_BIT) +#define SSI_SR_END (1 << 7) +#define SSI_SR_BUSY (1 << 6) +#define SSI_SR_TFF (1 << 5) +#define SSI_SR_RFE (1 << 4) +#define SSI_SR_TFHE (1 << 3) +#define SSI_SR_RFHF (1 << 2) +#define SSI_SR_UNDR (1 << 1) +#define SSI_SR_OVER (1 << 0) + +/* SSI Interval Time Control Register (SSI_ITR) */ + +#define SSI_ITR_CNTCLK (1 << 15) +#define SSI_ITR_IVLTM_BIT 0 +#define SSI_ITR_IVLTM_MASK (0x7fff << SSI_ITR_IVLTM_BIT) + + +/************************************************************************* + * MSC + *************************************************************************/ +#define MSC_STRPCL (MSC_BASE + 0x000) +#define MSC_STAT (MSC_BASE + 0x004) +#define MSC_CLKRT (MSC_BASE + 0x008) +#define MSC_CMDAT (MSC_BASE + 0x00C) +#define MSC_RESTO (MSC_BASE + 0x010) +#define MSC_RDTO (MSC_BASE + 0x014) +#define MSC_BLKLEN (MSC_BASE + 0x018) +#define MSC_NOB (MSC_BASE + 0x01C) +#define MSC_SNOB (MSC_BASE + 0x020) +#define MSC_IMASK (MSC_BASE + 0x024) +#define MSC_IREG (MSC_BASE + 0x028) +#define MSC_CMD (MSC_BASE + 0x02C) +#define MSC_ARG (MSC_BASE + 0x030) +#define MSC_RES (MSC_BASE + 0x034) +#define MSC_RXFIFO (MSC_BASE + 0x038) +#define MSC_TXFIFO (MSC_BASE + 0x03C) + +#define REG_MSC_STRPCL REG16(MSC_STRPCL) +#define REG_MSC_STAT REG32(MSC_STAT) +#define REG_MSC_CLKRT REG16(MSC_CLKRT) +#define REG_MSC_CMDAT REG32(MSC_CMDAT) +#define REG_MSC_RESTO REG16(MSC_RESTO) +#define REG_MSC_RDTO REG16(MSC_RDTO) +#define REG_MSC_BLKLEN REG16(MSC_BLKLEN) +#define REG_MSC_NOB REG16(MSC_NOB) +#define REG_MSC_SNOB REG16(MSC_SNOB) +#define REG_MSC_IMASK REG16(MSC_IMASK) +#define REG_MSC_IREG REG16(MSC_IREG) +#define REG_MSC_CMD REG8(MSC_CMD) +#define REG_MSC_ARG REG32(MSC_ARG) +#define REG_MSC_RES REG16(MSC_RES) +#define REG_MSC_RXFIFO REG32(MSC_RXFIFO) +#define REG_MSC_TXFIFO REG32(MSC_TXFIFO) + +/* MSC Clock and Control Register (MSC_STRPCL) */ + +#define MSC_STRPCL_EXIT_MULTIPLE (1 << 7) +#define MSC_STRPCL_EXIT_TRANSFER (1 << 6) +#define MSC_STRPCL_START_READWAIT (1 << 5) +#define MSC_STRPCL_STOP_READWAIT (1 << 4) +#define MSC_STRPCL_RESET (1 << 3) +#define MSC_STRPCL_START_OP (1 << 2) +#define MSC_STRPCL_CLOCK_CONTROL_BIT 0 +#define MSC_STRPCL_CLOCK_CONTROL_MASK (0x3 << MSC_STRPCL_CLOCK_CONTROL_BIT) + #define MSC_STRPCL_CLOCK_CONTROL_STOP (0x1 << MSC_STRPCL_CLOCK_CONTROL_BIT) /* Stop MMC/SD clock */ + #define MSC_STRPCL_CLOCK_CONTROL_START (0x2 << MSC_STRPCL_CLOCK_CONTROL_BIT) /* Start MMC/SD clock */ + +/* MSC Status Register (MSC_STAT) */ + +#define MSC_STAT_IS_RESETTING (1 << 15) +#define MSC_STAT_SDIO_INT_ACTIVE (1 << 14) +#define MSC_STAT_PRG_DONE (1 << 13) +#define MSC_STAT_DATA_TRAN_DONE (1 << 12) +#define MSC_STAT_END_CMD_RES (1 << 11) +#define MSC_STAT_DATA_FIFO_AFULL (1 << 10) +#define MSC_STAT_IS_READWAIT (1 << 9) +#define MSC_STAT_CLK_EN (1 << 8) +#define MSC_STAT_DATA_FIFO_FULL (1 << 7) +#define MSC_STAT_DATA_FIFO_EMPTY (1 << 6) +#define MSC_STAT_CRC_RES_ERR (1 << 5) +#define MSC_STAT_CRC_READ_ERROR (1 << 4) +#define MSC_STAT_CRC_WRITE_ERROR_BIT 2 +#define MSC_STAT_CRC_WRITE_ERROR_MASK (0x3 << MSC_STAT_CRC_WRITE_ERROR_BIT) + #define MSC_STAT_CRC_WRITE_ERROR_NO (0 << MSC_STAT_CRC_WRITE_ERROR_BIT) /* No error on transmission of data */ + #define MSC_STAT_CRC_WRITE_ERROR (1 << MSC_STAT_CRC_WRITE_ERROR_BIT) /* Card observed erroneous transmission of data */ + #define MSC_STAT_CRC_WRITE_ERROR_NOSTS (2 << MSC_STAT_CRC_WRITE_ERROR_BIT) /* No CRC status is sent back */ +#define MSC_STAT_TIME_OUT_RES (1 << 1) +#define MSC_STAT_TIME_OUT_READ (1 << 0) + +/* MSC Bus Clock Control Register (MSC_CLKRT) */ + +#define MSC_CLKRT_CLK_RATE_BIT 0 +#define MSC_CLKRT_CLK_RATE_MASK (0x7 << MSC_CLKRT_CLK_RATE_BIT) + #define MSC_CLKRT_CLK_RATE_DIV_1 (0x0 << MSC_CLKRT_CLK_RATE_BIT) /* CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_2 (0x1 << MSC_CLKRT_CLK_RATE_BIT) /* 1/2 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_4 (0x2 << MSC_CLKRT_CLK_RATE_BIT) /* 1/4 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_8 (0x3 << MSC_CLKRT_CLK_RATE_BIT) /* 1/8 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_16 (0x4 << MSC_CLKRT_CLK_RATE_BIT) /* 1/16 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_32 (0x5 << MSC_CLKRT_CLK_RATE_BIT) /* 1/32 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_64 (0x6 << MSC_CLKRT_CLK_RATE_BIT) /* 1/64 of CLK_SRC */ + #define MSC_CLKRT_CLK_RATE_DIV_128 (0x7 << MSC_CLKRT_CLK_RATE_BIT) /* 1/128 of CLK_SRC */ + +/* MSC Command Sequence Control Register (MSC_CMDAT) */ + +#define MSC_CMDAT_IO_ABORT (1 << 11) +#define MSC_CMDAT_BUS_WIDTH_BIT 9 +#define MSC_CMDAT_BUS_WIDTH_MASK (0x3 << MSC_CMDAT_BUS_WIDTH_BIT) + #define MSC_CMDAT_BUS_WIDTH_1BIT (0x0 << MSC_CMDAT_BUS_WIDTH_BIT) /* 1-bit data bus */ + #define MSC_CMDAT_BUS_WIDTH_4BIT (0x2 << MSC_CMDAT_BUS_WIDTH_BIT) /* 4-bit data bus */ + #define CMDAT_BUS_WIDTH1 (0x0 << MSC_CMDAT_BUS_WIDTH_BIT) + #define CMDAT_BUS_WIDTH4 (0x2 << MSC_CMDAT_BUS_WIDTH_BIT) +#define MSC_CMDAT_DMA_EN (1 << 8) +#define MSC_CMDAT_INIT (1 << 7) +#define MSC_CMDAT_BUSY (1 << 6) +#define MSC_CMDAT_STREAM_BLOCK (1 << 5) +#define MSC_CMDAT_WRITE (1 << 4) +#define MSC_CMDAT_READ (0 << 4) +#define MSC_CMDAT_DATA_EN (1 << 3) +#define MSC_CMDAT_RESPONSE_BIT 0 +#define MSC_CMDAT_RESPONSE_MASK (0x7 << MSC_CMDAT_RESPONSE_BIT) + #define MSC_CMDAT_RESPONSE_NONE (0x0 << MSC_CMDAT_RESPONSE_BIT) /* No response */ + #define MSC_CMDAT_RESPONSE_R1 (0x1 << MSC_CMDAT_RESPONSE_BIT) /* Format R1 and R1b */ + #define MSC_CMDAT_RESPONSE_R2 (0x2 << MSC_CMDAT_RESPONSE_BIT) /* Format R2 */ + #define MSC_CMDAT_RESPONSE_R3 (0x3 << MSC_CMDAT_RESPONSE_BIT) /* Format R3 */ + #define MSC_CMDAT_RESPONSE_R4 (0x4 << MSC_CMDAT_RESPONSE_BIT) /* Format R4 */ + #define MSC_CMDAT_RESPONSE_R5 (0x5 << MSC_CMDAT_RESPONSE_BIT) /* Format R5 */ + #define MSC_CMDAT_RESPONSE_R6 (0x6 << MSC_CMDAT_RESPONSE_BIT) /* Format R6 */ + +#define CMDAT_DMA_EN (1 << 8) +#define CMDAT_INIT (1 << 7) +#define CMDAT_BUSY (1 << 6) +#define CMDAT_STREAM (1 << 5) +#define CMDAT_WRITE (1 << 4) +#define CMDAT_DATA_EN (1 << 3) + +/* MSC Interrupts Mask Register (MSC_IMASK) */ + +#define MSC_IMASK_SDIO (1 << 7) +#define MSC_IMASK_TXFIFO_WR_REQ (1 << 6) +#define MSC_IMASK_RXFIFO_RD_REQ (1 << 5) +#define MSC_IMASK_END_CMD_RES (1 << 2) +#define MSC_IMASK_PRG_DONE (1 << 1) +#define MSC_IMASK_DATA_TRAN_DONE (1 << 0) + + +/* MSC Interrupts Status Register (MSC_IREG) */ + +#define MSC_IREG_SDIO (1 << 7) +#define MSC_IREG_TXFIFO_WR_REQ (1 << 6) +#define MSC_IREG_RXFIFO_RD_REQ (1 << 5) +#define MSC_IREG_END_CMD_RES (1 << 2) +#define MSC_IREG_PRG_DONE (1 << 1) +#define MSC_IREG_DATA_TRAN_DONE (1 << 0) + + +/************************************************************************* + * EMC (External Memory Controller) + *************************************************************************/ +#define EMC_BCR (EMC_BASE + 0x0) /* BCR */ + +#define EMC_SMCR0 (EMC_BASE + 0x10) /* Static Memory Control Register 0 */ +#define EMC_SMCR1 (EMC_BASE + 0x14) /* Static Memory Control Register 1 */ +#define EMC_SMCR2 (EMC_BASE + 0x18) /* Static Memory Control Register 2 */ +#define EMC_SMCR3 (EMC_BASE + 0x1c) /* Static Memory Control Register 3 */ +#define EMC_SMCR4 (EMC_BASE + 0x20) /* Static Memory Control Register 4 */ +#define EMC_SACR0 (EMC_BASE + 0x30) /* Static Memory Bank 0 Addr Config Reg */ +#define EMC_SACR1 (EMC_BASE + 0x34) /* Static Memory Bank 1 Addr Config Reg */ +#define EMC_SACR2 (EMC_BASE + 0x38) /* Static Memory Bank 2 Addr Config Reg */ +#define EMC_SACR3 (EMC_BASE + 0x3c) /* Static Memory Bank 3 Addr Config Reg */ +#define EMC_SACR4 (EMC_BASE + 0x40) /* Static Memory Bank 4 Addr Config Reg */ + +#define EMC_NFCSR (EMC_BASE + 0x050) /* NAND Flash Control/Status Register */ +#define EMC_NFECR (EMC_BASE + 0x100) /* NAND Flash ECC Control Register */ +#define EMC_NFECC (EMC_BASE + 0x104) /* NAND Flash ECC Data Register */ +#define EMC_NFPAR0 (EMC_BASE + 0x108) /* NAND Flash RS Parity 0 Register */ +#define EMC_NFPAR1 (EMC_BASE + 0x10c) /* NAND Flash RS Parity 1 Register */ +#define EMC_NFPAR2 (EMC_BASE + 0x110) /* NAND Flash RS Parity 2 Register */ +#define EMC_NFINTS (EMC_BASE + 0x114) /* NAND Flash Interrupt Status Register */ +#define EMC_NFINTE (EMC_BASE + 0x118) /* NAND Flash Interrupt Enable Register */ +#define EMC_NFERR0 (EMC_BASE + 0x11c) /* NAND Flash RS Error Report 0 Register */ +#define EMC_NFERR1 (EMC_BASE + 0x120) /* NAND Flash RS Error Report 1 Register */ +#define EMC_NFERR2 (EMC_BASE + 0x124) /* NAND Flash RS Error Report 2 Register */ +#define EMC_NFERR3 (EMC_BASE + 0x128) /* NAND Flash RS Error Report 3 Register */ + +#define EMC_DMCR (EMC_BASE + 0x80) /* DRAM Control Register */ +#define EMC_RTCSR (EMC_BASE + 0x84) /* Refresh Time Control/Status Register */ +#define EMC_RTCNT (EMC_BASE + 0x88) /* Refresh Timer Counter */ +#define EMC_RTCOR (EMC_BASE + 0x8c) /* Refresh Time Constant Register */ +#define EMC_DMAR0 (EMC_BASE + 0x90) /* SDRAM Bank 0 Addr Config Register */ +#define EMC_SDMR0 (EMC_BASE + 0xa000) /* Mode Register of SDRAM bank 0 */ + +#define REG_EMC_BCR REG32(EMC_BCR) + +#define REG_EMC_SMCR0 REG32(EMC_SMCR0) +#define REG_EMC_SMCR1 REG32(EMC_SMCR1) +#define REG_EMC_SMCR2 REG32(EMC_SMCR2) +#define REG_EMC_SMCR3 REG32(EMC_SMCR3) +#define REG_EMC_SMCR4 REG32(EMC_SMCR4) +#define REG_EMC_SACR0 REG32(EMC_SACR0) +#define REG_EMC_SACR1 REG32(EMC_SACR1) +#define REG_EMC_SACR2 REG32(EMC_SACR2) +#define REG_EMC_SACR3 REG32(EMC_SACR3) +#define REG_EMC_SACR4 REG32(EMC_SACR4) + +#define REG_EMC_NFCSR REG32(EMC_NFCSR) +#define REG_EMC_NFECR REG32(EMC_NFECR) +#define REG_EMC_NFECC REG32(EMC_NFECC) +#define REG_EMC_NFPAR0 REG32(EMC_NFPAR0) +#define REG_EMC_NFPAR1 REG32(EMC_NFPAR1) +#define REG_EMC_NFPAR2 REG32(EMC_NFPAR2) +#define REG_EMC_NFINTS REG32(EMC_NFINTS) +#define REG_EMC_NFINTE REG32(EMC_NFINTE) +#define REG_EMC_NFERR0 REG32(EMC_NFERR0) +#define REG_EMC_NFERR1 REG32(EMC_NFERR1) +#define REG_EMC_NFERR2 REG32(EMC_NFERR2) +#define REG_EMC_NFERR3 REG32(EMC_NFERR3) + +#define REG_EMC_DMCR REG32(EMC_DMCR) +#define REG_EMC_RTCSR REG16(EMC_RTCSR) +#define REG_EMC_RTCNT REG16(EMC_RTCNT) +#define REG_EMC_RTCOR REG16(EMC_RTCOR) +#define REG_EMC_DMAR0 REG32(EMC_DMAR0) + +/* Static Memory Control Register */ +#define EMC_SMCR_STRV_BIT 24 +#define EMC_SMCR_STRV_MASK (0x0f << EMC_SMCR_STRV_BIT) +#define EMC_SMCR_TAW_BIT 20 +#define EMC_SMCR_TAW_MASK (0x0f << EMC_SMCR_TAW_BIT) +#define EMC_SMCR_TBP_BIT 16 +#define EMC_SMCR_TBP_MASK (0x0f << EMC_SMCR_TBP_BIT) +#define EMC_SMCR_TAH_BIT 12 +#define EMC_SMCR_TAH_MASK (0x07 << EMC_SMCR_TAH_BIT) +#define EMC_SMCR_TAS_BIT 8 +#define EMC_SMCR_TAS_MASK (0x07 << EMC_SMCR_TAS_BIT) +#define EMC_SMCR_BW_BIT 6 +#define EMC_SMCR_BW_MASK (0x03 << EMC_SMCR_BW_BIT) /* Bus Width? */ + #define EMC_SMCR_BW_8BIT (0 << EMC_SMCR_BW_BIT) + #define EMC_SMCR_BW_16BIT (1 << EMC_SMCR_BW_BIT) + #define EMC_SMCR_BW_32BIT (2 << EMC_SMCR_BW_BIT) +#define EMC_SMCR_BCM (1 << 3) +#define EMC_SMCR_BL_BIT 1 +#define EMC_SMCR_BL_MASK (0x03 << EMC_SMCR_BL_BIT) /* Bus Latency? */ + #define EMC_SMCR_BL_4 (0 << EMC_SMCR_BL_BIT) + #define EMC_SMCR_BL_8 (1 << EMC_SMCR_BL_BIT) + #define EMC_SMCR_BL_16 (2 << EMC_SMCR_BL_BIT) + #define EMC_SMCR_BL_32 (3 << EMC_SMCR_BL_BIT) +#define EMC_SMCR_SMT (1 << 0) + +/* Static Memory Bank Addr Config Reg */ +#define EMC_SACR_BASE_BIT 8 +#define EMC_SACR_BASE_MASK (0xff << EMC_SACR_BASE_BIT) +#define EMC_SACR_MASK_BIT 0 +#define EMC_SACR_MASK_MASK (0xff << EMC_SACR_MASK_BIT) + +/* NAND Flash Control/Status Register */ +#define EMC_NFCSR_NFCE4 (1 << 7) /* NAND Flash Enable */ +#define EMC_NFCSR_NFE4 (1 << 6) /* NAND Flash FCE# Assertion Enable */ +#define EMC_NFCSR_NFCE3 (1 << 5) +#define EMC_NFCSR_NFE3 (1 << 4) +#define EMC_NFCSR_NFCE2 (1 << 3) +#define EMC_NFCSR_NFE2 (1 << 2) +#define EMC_NFCSR_NFCE1 (1 << 1) +#define EMC_NFCSR_NFE1 (1 << 0) +#define EMC_NFCSR_NFE(n) (1 << (((n)-1)*2)) +#define EMC_NFCSR_NFCE(n) (1 << (((n)*2)-1)) + +/* NAND Flash ECC Control Register */ +#define EMC_NFECR_PRDY (1 << 4) /* Parity Ready */ +#define EMC_NFECR_RS_DECODING (0 << 3) /* RS is in decoding phase */ +#define EMC_NFECR_RS_ENCODING (1 << 3) /* RS is in encoding phase */ +#define EMC_NFECR_HAMMING (0 << 2) /* Select HAMMING Correction Algorithm */ +#define EMC_NFECR_RS (1 << 2) /* Select RS Correction Algorithm */ +#define EMC_NFECR_ERST (1 << 1) /* ECC Reset */ +#define EMC_NFECR_ECCE (1 << 0) /* ECC Enable */ + +/* NAND Flash ECC Data Register */ +#define EMC_NFECC_ECC2_BIT 16 +#define EMC_NFECC_ECC2_MASK (0xff << EMC_NFECC_ECC2_BIT) +#define EMC_NFECC_ECC1_BIT 8 +#define EMC_NFECC_ECC1_MASK (0xff << EMC_NFECC_ECC1_BIT) +#define EMC_NFECC_ECC0_BIT 0 +#define EMC_NFECC_ECC0_MASK (0xff << EMC_NFECC_ECC0_BIT) + +/* NAND Flash Interrupt Status Register */ +#define EMC_NFINTS_ERRCNT_BIT 29 /* Error Count */ +#define EMC_NFINTS_ERRCNT_MASK (0x7 << EMC_NFINTS_ERRCNT_BIT) +#define EMC_NFINTS_PADF (1 << 4) /* Padding Finished */ +#define EMC_NFINTS_DECF (1 << 3) /* Decoding Finished */ +#define EMC_NFINTS_ENCF (1 << 2) /* Encoding Finished */ +#define EMC_NFINTS_UNCOR (1 << 1) /* Uncorrectable Error Occurred */ +#define EMC_NFINTS_ERR (1 << 0) /* Error Occurred */ + +/* NAND Flash Interrupt Enable Register */ +#define EMC_NFINTE_PADFE (1 << 4) /* Padding Finished Interrupt Enable */ +#define EMC_NFINTE_DECFE (1 << 3) /* Decoding Finished Interrupt Enable */ +#define EMC_NFINTE_ENCFE (1 << 2) /* Encoding Finished Interrupt Enable */ +#define EMC_NFINTE_UNCORE (1 << 1) /* Uncorrectable Error Occurred Intr Enable */ +#define EMC_NFINTE_ERRE (1 << 0) /* Error Occurred Interrupt */ + +/* NAND Flash RS Error Report Register */ +#define EMC_NFERR_INDEX_BIT 16 /* Error Symbol Index */ +#define EMC_NFERR_INDEX_MASK (0x1ff << EMC_NFERR_INDEX_BIT) +#define EMC_NFERR_MASK_BIT 0 /* Error Symbol Value */ +#define EMC_NFERR_MASK_MASK (0x1ff << EMC_NFERR_MASK_BIT) + + +/* DRAM Control Register */ +#define EMC_DMCR_BW_BIT 31 +#define EMC_DMCR_BW (1 << EMC_DMCR_BW_BIT) +#define EMC_DMCR_CA_BIT 26 +#define EMC_DMCR_CA_MASK (0x07 << EMC_DMCR_CA_BIT) + #define EMC_DMCR_CA_8 (0 << EMC_DMCR_CA_BIT) + #define EMC_DMCR_CA_9 (1 << EMC_DMCR_CA_BIT) + #define EMC_DMCR_CA_10 (2 << EMC_DMCR_CA_BIT) + #define EMC_DMCR_CA_11 (3 << EMC_DMCR_CA_BIT) + #define EMC_DMCR_CA_12 (4 << EMC_DMCR_CA_BIT) +#define EMC_DMCR_RMODE (1 << 25) +#define EMC_DMCR_RFSH (1 << 24) +#define EMC_DMCR_MRSET (1 << 23) +#define EMC_DMCR_RA_BIT 20 +#define EMC_DMCR_RA_MASK (0x03 << EMC_DMCR_RA_BIT) + #define EMC_DMCR_RA_11 (0 << EMC_DMCR_RA_BIT) + #define EMC_DMCR_RA_12 (1 << EMC_DMCR_RA_BIT) + #define EMC_DMCR_RA_13 (2 << EMC_DMCR_RA_BIT) +#define EMC_DMCR_BA_BIT 19 +#define EMC_DMCR_BA (1 << EMC_DMCR_BA_BIT) +#define EMC_DMCR_PDM (1 << 18) +#define EMC_DMCR_EPIN (1 << 17) +#define EMC_DMCR_TRAS_BIT 13 +#define EMC_DMCR_TRAS_MASK (0x07 << EMC_DMCR_TRAS_BIT) +#define EMC_DMCR_RCD_BIT 11 +#define EMC_DMCR_RCD_MASK (0x03 << EMC_DMCR_RCD_BIT) +#define EMC_DMCR_TPC_BIT 8 +#define EMC_DMCR_TPC_MASK (0x07 << EMC_DMCR_TPC_BIT) +#define EMC_DMCR_TRWL_BIT 5 +#define EMC_DMCR_TRWL_MASK (0x03 << EMC_DMCR_TRWL_BIT) +#define EMC_DMCR_TRC_BIT 2 +#define EMC_DMCR_TRC_MASK (0x07 << EMC_DMCR_TRC_BIT) +#define EMC_DMCR_TCL_BIT 0 +#define EMC_DMCR_TCL_MASK (0x03 << EMC_DMCR_TCL_BIT) + +/* Refresh Time Control/Status Register */ +#define EMC_RTCSR_CMF (1 << 7) +#define EMC_RTCSR_CKS_BIT 0 +#define EMC_RTCSR_CKS_MASK (0x07 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_DISABLE (0 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_4 (1 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_16 (2 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_64 (3 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_256 (4 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_1024 (5 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_2048 (6 << EMC_RTCSR_CKS_BIT) + #define EMC_RTCSR_CKS_4096 (7 << EMC_RTCSR_CKS_BIT) + +/* SDRAM Bank Address Configuration Register */ +#define EMC_DMAR_BASE_BIT 8 +#define EMC_DMAR_BASE_MASK (0xff << EMC_DMAR_BASE_BIT) +#define EMC_DMAR_MASK_BIT 0 +#define EMC_DMAR_MASK_MASK (0xff << EMC_DMAR_MASK_BIT) + +/* Mode Register of SDRAM bank 0 */ +#define EMC_SDMR_BM (1 << 9) /* Write Burst Mode */ +#define EMC_SDMR_OM_BIT 7 /* Operating Mode */ +#define EMC_SDMR_OM_MASK (3 << EMC_SDMR_OM_BIT) + #define EMC_SDMR_OM_NORMAL (0 << EMC_SDMR_OM_BIT) +#define EMC_SDMR_CAS_BIT 4 /* CAS Latency */ +#define EMC_SDMR_CAS_MASK (7 << EMC_SDMR_CAS_BIT) + #define EMC_SDMR_CAS_1 (1 << EMC_SDMR_CAS_BIT) + #define EMC_SDMR_CAS_2 (2 << EMC_SDMR_CAS_BIT) + #define EMC_SDMR_CAS_3 (3 << EMC_SDMR_CAS_BIT) +#define EMC_SDMR_BT_BIT 3 /* Burst Type */ +#define EMC_SDMR_BT_MASK (1 << EMC_SDMR_BT_BIT) + #define EMC_SDMR_BT_SEQ (0 << EMC_SDMR_BT_BIT) /* Sequential */ + #define EMC_SDMR_BT_INT (1 << EMC_SDMR_BT_BIT) /* Interleave */ +#define EMC_SDMR_BL_BIT 0 /* Burst Length */ +#define EMC_SDMR_BL_MASK (7 << EMC_SDMR_BL_BIT) + #define EMC_SDMR_BL_1 (0 << EMC_SDMR_BL_BIT) + #define EMC_SDMR_BL_2 (1 << EMC_SDMR_BL_BIT) + #define EMC_SDMR_BL_4 (2 << EMC_SDMR_BL_BIT) + #define EMC_SDMR_BL_8 (3 << EMC_SDMR_BL_BIT) + +#define EMC_SDMR_CAS2_16BIT \ + (EMC_SDMR_CAS_2 | EMC_SDMR_BT_SEQ | EMC_SDMR_BL_2) +#define EMC_SDMR_CAS2_32BIT \ + (EMC_SDMR_CAS_2 | EMC_SDMR_BT_SEQ | EMC_SDMR_BL_4) +#define EMC_SDMR_CAS3_16BIT \ + (EMC_SDMR_CAS_3 | EMC_SDMR_BT_SEQ | EMC_SDMR_BL_2) +#define EMC_SDMR_CAS3_32BIT \ + (EMC_SDMR_CAS_3 | EMC_SDMR_BT_SEQ | EMC_SDMR_BL_4) + + +/************************************************************************* + * CIM + *************************************************************************/ +#define CIM_CFG (CIM_BASE + 0x0000) +#define CIM_CTRL (CIM_BASE + 0x0004) +#define CIM_STATE (CIM_BASE + 0x0008) +#define CIM_IID (CIM_BASE + 0x000C) +#define CIM_RXFIFO (CIM_BASE + 0x0010) +#define CIM_DA (CIM_BASE + 0x0020) +#define CIM_FA (CIM_BASE + 0x0024) +#define CIM_FID (CIM_BASE + 0x0028) +#define CIM_CMD (CIM_BASE + 0x002C) + +#define REG_CIM_CFG REG32(CIM_CFG) +#define REG_CIM_CTRL REG32(CIM_CTRL) +#define REG_CIM_STATE REG32(CIM_STATE) +#define REG_CIM_IID REG32(CIM_IID) +#define REG_CIM_RXFIFO REG32(CIM_RXFIFO) +#define REG_CIM_DA REG32(CIM_DA) +#define REG_CIM_FA REG32(CIM_FA) +#define REG_CIM_FID REG32(CIM_FID) +#define REG_CIM_CMD REG32(CIM_CMD) + +/* CIM Configuration Register (CIM_CFG) */ + +#define CIM_CFG_INV_DAT (1 << 15) +#define CIM_CFG_VSP (1 << 14) +#define CIM_CFG_HSP (1 << 13) +#define CIM_CFG_PCP (1 << 12) +#define CIM_CFG_DUMMY_ZERO (1 << 9) +#define CIM_CFG_EXT_VSYNC (1 << 8) +#define CIM_CFG_PACK_BIT 4 +#define CIM_CFG_PACK_MASK (0x7 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_0 (0 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_1 (1 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_2 (2 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_3 (3 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_4 (4 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_5 (5 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_6 (6 << CIM_CFG_PACK_BIT) + #define CIM_CFG_PACK_7 (7 << CIM_CFG_PACK_BIT) +#define CIM_CFG_DSM_BIT 0 +#define CIM_CFG_DSM_MASK (0x3 << CIM_CFG_DSM_BIT) + #define CIM_CFG_DSM_CPM (0 << CIM_CFG_DSM_BIT) /* CCIR656 Progressive Mode */ + #define CIM_CFG_DSM_CIM (1 << CIM_CFG_DSM_BIT) /* CCIR656 Interlace Mode */ + #define CIM_CFG_DSM_GCM (2 << CIM_CFG_DSM_BIT) /* Gated Clock Mode */ + #define CIM_CFG_DSM_NGCM (3 << CIM_CFG_DSM_BIT) /* Non-Gated Clock Mode */ + +/* CIM Control Register (CIM_CTRL) */ + +#define CIM_CTRL_MCLKDIV_BIT 24 +#define CIM_CTRL_MCLKDIV_MASK (0xff << CIM_CTRL_MCLKDIV_BIT) +#define CIM_CTRL_FRC_BIT 16 +#define CIM_CTRL_FRC_MASK (0xf << CIM_CTRL_FRC_BIT) + #define CIM_CTRL_FRC_1 (0x0 << CIM_CTRL_FRC_BIT) /* Sample every frame */ + #define CIM_CTRL_FRC_2 (0x1 << CIM_CTRL_FRC_BIT) /* Sample 1/2 frame */ + #define CIM_CTRL_FRC_3 (0x2 << CIM_CTRL_FRC_BIT) /* Sample 1/3 frame */ + #define CIM_CTRL_FRC_4 (0x3 << CIM_CTRL_FRC_BIT) /* Sample 1/4 frame */ + #define CIM_CTRL_FRC_5 (0x4 << CIM_CTRL_FRC_BIT) /* Sample 1/5 frame */ + #define CIM_CTRL_FRC_6 (0x5 << CIM_CTRL_FRC_BIT) /* Sample 1/6 frame */ + #define CIM_CTRL_FRC_7 (0x6 << CIM_CTRL_FRC_BIT) /* Sample 1/7 frame */ + #define CIM_CTRL_FRC_8 (0x7 << CIM_CTRL_FRC_BIT) /* Sample 1/8 frame */ + #define CIM_CTRL_FRC_9 (0x8 << CIM_CTRL_FRC_BIT) /* Sample 1/9 frame */ + #define CIM_CTRL_FRC_10 (0x9 << CIM_CTRL_FRC_BIT) /* Sample 1/10 frame */ + #define CIM_CTRL_FRC_11 (0xA << CIM_CTRL_FRC_BIT) /* Sample 1/11 frame */ + #define CIM_CTRL_FRC_12 (0xB << CIM_CTRL_FRC_BIT) /* Sample 1/12 frame */ + #define CIM_CTRL_FRC_13 (0xC << CIM_CTRL_FRC_BIT) /* Sample 1/13 frame */ + #define CIM_CTRL_FRC_14 (0xD << CIM_CTRL_FRC_BIT) /* Sample 1/14 frame */ + #define CIM_CTRL_FRC_15 (0xE << CIM_CTRL_FRC_BIT) /* Sample 1/15 frame */ + #define CIM_CTRL_FRC_16 (0xF << CIM_CTRL_FRC_BIT) /* Sample 1/16 frame */ +#define CIM_CTRL_VDDM (1 << 13) +#define CIM_CTRL_DMA_SOFM (1 << 12) +#define CIM_CTRL_DMA_EOFM (1 << 11) +#define CIM_CTRL_DMA_STOPM (1 << 10) +#define CIM_CTRL_RXF_TRIGM (1 << 9) +#define CIM_CTRL_RXF_OFM (1 << 8) +#define CIM_CTRL_RXF_TRIG_BIT 4 +#define CIM_CTRL_RXF_TRIG_MASK (0x7 << CIM_CTRL_RXF_TRIG_BIT) + #define CIM_CTRL_RXF_TRIG_4 (0 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 4 */ + #define CIM_CTRL_RXF_TRIG_8 (1 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 8 */ + #define CIM_CTRL_RXF_TRIG_12 (2 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 12 */ + #define CIM_CTRL_RXF_TRIG_16 (3 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 16 */ + #define CIM_CTRL_RXF_TRIG_20 (4 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 20 */ + #define CIM_CTRL_RXF_TRIG_24 (5 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 24 */ + #define CIM_CTRL_RXF_TRIG_28 (6 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 28 */ + #define CIM_CTRL_RXF_TRIG_32 (7 << CIM_CTRL_RXF_TRIG_BIT) /* RXFIFO Trigger Value is 32 */ +#define CIM_CTRL_DMA_EN (1 << 2) +#define CIM_CTRL_RXF_RST (1 << 1) +#define CIM_CTRL_ENA (1 << 0) + +/* CIM State Register (CIM_STATE) */ + +#define CIM_STATE_DMA_SOF (1 << 6) +#define CIM_STATE_DMA_EOF (1 << 5) +#define CIM_STATE_DMA_STOP (1 << 4) +#define CIM_STATE_RXF_OF (1 << 3) +#define CIM_STATE_RXF_TRIG (1 << 2) +#define CIM_STATE_RXF_EMPTY (1 << 1) +#define CIM_STATE_VDD (1 << 0) + +/* CIM DMA Command Register (CIM_CMD) */ + +#define CIM_CMD_SOFINT (1 << 31) +#define CIM_CMD_EOFINT (1 << 30) +#define CIM_CMD_STOP (1 << 28) +#define CIM_CMD_LEN_BIT 0 +#define CIM_CMD_LEN_MASK (0xffffff << CIM_CMD_LEN_BIT) + + +/************************************************************************* + * SADC (Smart A/D Controller) + *************************************************************************/ + +#define SADC_ENA (SADC_BASE + 0x00) /* ADC Enable Register */ +#define SADC_CFG (SADC_BASE + 0x04) /* ADC Configure Register */ +#define SADC_CTRL (SADC_BASE + 0x08) /* ADC Control Register */ +#define SADC_STATE (SADC_BASE + 0x0C) /* ADC Status Register*/ +#define SADC_SAMETIME (SADC_BASE + 0x10) /* ADC Same Point Time Register */ +#define SADC_WAITTIME (SADC_BASE + 0x14) /* ADC Wait Time Register */ +#define SADC_TSDAT (SADC_BASE + 0x18) /* ADC Touch Screen Data Register */ +#define SADC_BATDAT (SADC_BASE + 0x1C) /* ADC PBAT Data Register */ +#define SADC_SADDAT (SADC_BASE + 0x20) /* ADC SADCIN Data Register */ + +#define REG_SADC_ENA REG8(SADC_ENA) +#define REG_SADC_CFG REG32(SADC_CFG) +#define REG_SADC_CTRL REG8(SADC_CTRL) +#define REG_SADC_STATE REG8(SADC_STATE) +#define REG_SADC_SAMETIME REG16(SADC_SAMETIME) +#define REG_SADC_WAITTIME REG16(SADC_WAITTIME) +#define REG_SADC_TSDAT REG32(SADC_TSDAT) +#define REG_SADC_BATDAT REG16(SADC_BATDAT) +#define REG_SADC_SADDAT REG16(SADC_SADDAT) + +/* ADC Enable Register */ +#define SADC_ENA_ADEN (1 << 7) /* Touch Screen Enable */ +#define SADC_ENA_TSEN (1 << 2) /* Touch Screen Enable */ +#define SADC_ENA_PBATEN (1 << 1) /* PBAT Enable */ +#define SADC_ENA_SADCINEN (1 << 0) /* SADCIN Enable */ + +/* ADC Configure Register */ +#define SADC_CFG_CLKOUT_NUM_BIT 16 +#define SADC_CFG_CLKOUT_NUM_MASK (0x7 << SADC_CFG_CLKOUT_NUM_BIT) +#define SADC_CFG_TS_DMA (1 << 15) /* Touch Screen DMA Enable */ +#define SADC_CFG_XYZ_BIT 13 /* XYZ selection */ +#define SADC_CFG_XYZ_MASK (0x3 << SADC_CFG_XYZ_BIT) + #define SADC_CFG_XY (0 << SADC_CFG_XYZ_BIT) + #define SADC_CFG_XYZ (1 << SADC_CFG_XYZ_BIT) + #define SADC_CFG_XYZ1Z2 (2 << SADC_CFG_XYZ_BIT) +#define SADC_CFG_SNUM_BIT 10 /* Sample Number */ +#define SADC_CFG_SNUM_MASK (0x7 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_1 (0x0 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_2 (0x1 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_3 (0x2 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_4 (0x3 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_5 (0x4 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_6 (0x5 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_8 (0x6 << SADC_CFG_SNUM_BIT) + #define SADC_CFG_SNUM_9 (0x7 << SADC_CFG_SNUM_BIT) +#define SADC_CFG_CLKDIV_BIT 5 /* AD Converter frequency clock divider */ +#define SADC_CFG_CLKDIV_MASK (0x1f << SADC_CFG_CLKDIV_BIT) +#define SADC_CFG_PBAT_HIGH (0 << 4) /* PBAT >= 2.5V */ +#define SADC_CFG_PBAT_LOW (1 << 4) /* PBAT < 2.5V */ +#define SADC_CFG_CMD_BIT 0 /* ADC Command */ +#define SADC_CFG_CMD_MASK (0xf << SADC_CFG_CMD_BIT) + #define SADC_CFG_CMD_X_SE (0x0 << SADC_CFG_CMD_BIT) /* X Single-End */ + #define SADC_CFG_CMD_Y_SE (0x1 << SADC_CFG_CMD_BIT) /* Y Single-End */ + #define SADC_CFG_CMD_X_DIFF (0x2 << SADC_CFG_CMD_BIT) /* X Differential */ + #define SADC_CFG_CMD_Y_DIFF (0x3 << SADC_CFG_CMD_BIT) /* Y Differential */ + #define SADC_CFG_CMD_Z1_DIFF (0x4 << SADC_CFG_CMD_BIT) /* Z1 Differential */ + #define SADC_CFG_CMD_Z2_DIFF (0x5 << SADC_CFG_CMD_BIT) /* Z2 Differential */ + #define SADC_CFG_CMD_Z3_DIFF (0x6 << SADC_CFG_CMD_BIT) /* Z3 Differential */ + #define SADC_CFG_CMD_Z4_DIFF (0x7 << SADC_CFG_CMD_BIT) /* Z4 Differential */ + #define SADC_CFG_CMD_TP_SE (0x8 << SADC_CFG_CMD_BIT) /* Touch Pressure */ + #define SADC_CFG_CMD_PBATH_SE (0x9 << SADC_CFG_CMD_BIT) /* PBAT >= 2.5V */ + #define SADC_CFG_CMD_PBATL_SE (0xa << SADC_CFG_CMD_BIT) /* PBAT < 2.5V */ + #define SADC_CFG_CMD_SADCIN_SE (0xb << SADC_CFG_CMD_BIT) /* Measure SADCIN */ + #define SADC_CFG_CMD_INT_PEN (0xc << SADC_CFG_CMD_BIT) /* INT_PEN Enable */ + +/* ADC Control Register */ +#define SADC_CTRL_PENDM (1 << 4) /* Pen Down Interrupt Mask */ +#define SADC_CTRL_PENUM (1 << 3) /* Pen Up Interrupt Mask */ +#define SADC_CTRL_TSRDYM (1 << 2) /* Touch Screen Data Ready Interrupt Mask */ +#define SADC_CTRL_PBATRDYM (1 << 1) /* PBAT Data Ready Interrupt Mask */ +#define SADC_CTRL_SRDYM (1 << 0) /* SADCIN Data Ready Interrupt Mask */ + +/* ADC Status Register */ +#define SADC_STATE_TSBUSY (1 << 7) /* TS A/D is working */ +#define SADC_STATE_PBATBUSY (1 << 6) /* PBAT A/D is working */ +#define SADC_STATE_SBUSY (1 << 5) /* SADCIN A/D is working */ +#define SADC_STATE_PEND (1 << 4) /* Pen Down Interrupt Flag */ +#define SADC_STATE_PENU (1 << 3) /* Pen Up Interrupt Flag */ +#define SADC_STATE_TSRDY (1 << 2) /* Touch Screen Data Ready Interrupt Flag */ +#define SADC_STATE_PBATRDY (1 << 1) /* PBAT Data Ready Interrupt Flag */ +#define SADC_STATE_SRDY (1 << 0) /* SADCIN Data Ready Interrupt Flag */ + +/* ADC Touch Screen Data Register */ +#define SADC_TSDAT_DATA0_BIT 0 +#define SADC_TSDAT_DATA0_MASK (0xfff << SADC_TSDAT_DATA0_BIT) +#define SADC_TSDAT_TYPE0 (1 << 15) +#define SADC_TSDAT_DATA1_BIT 16 +#define SADC_TSDAT_DATA1_MASK (0xfff << SADC_TSDAT_DATA1_BIT) +#define SADC_TSDAT_TYPE1 (1 << 31) + + +/************************************************************************* + * SLCD (Smart LCD Controller) + *************************************************************************/ + +#define SLCD_CFG (SLCD_BASE + 0xA0) /* SLCD Configure Register */ +#define SLCD_CTRL (SLCD_BASE + 0xA4) /* SLCD Control Register */ +#define SLCD_STATE (SLCD_BASE + 0xA8) /* SLCD Status Register */ +#define SLCD_DATA (SLCD_BASE + 0xAC) /* SLCD Data Register */ +#define SLCD_FIFO (SLCD_BASE + 0xB0) /* SLCD FIFO Register */ + +#define REG_SLCD_CFG REG32(SLCD_CFG) +#define REG_SLCD_CTRL REG8(SLCD_CTRL) +#define REG_SLCD_STATE REG8(SLCD_STATE) +#define REG_SLCD_DATA REG32(SLCD_DATA) +#define REG_SLCD_FIFO REG32(SLCD_FIFO) + +/* SLCD Configure Register */ +#define SLCD_CFG_BURST_BIT 14 +#define SLCD_CFG_BURST_MASK (0x3 << SLCD_CFG_BURST_BIT) + #define SLCD_CFG_BURST_4_WORD (0 << SLCD_CFG_BURST_BIT) + #define SLCD_CFG_BURST_8_WORD (1 << SLCD_CFG_BURST_BIT) +#define SLCD_CFG_DWIDTH_BIT 10 +#define SLCD_CFG_DWIDTH_MASK (0x7 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_18 (0 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_16 (1 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_8_x3 (2 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_8_x2 (3 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_8_x1 (4 << SLCD_CFG_DWIDTH_BIT) + #define SLCD_CFG_DWIDTH_9_x2 (7 << SLCD_CFG_DWIDTH_BIT) +#define SLCD_CFG_CWIDTH_BIT 8 +#define SLCD_CFG_CWIDTH_MASK (0x3 << SLCD_CFG_CWIDTH_BIT) + #define SLCD_CFG_CWIDTH_16BIT (0 << SLCD_CFG_CWIDTH_BIT) + #define SLCD_CFG_CWIDTH_8BIT (1 << SLCD_CFG_CWIDTH_BIT) + #define SLCD_CFG_CWIDTH_18BIT (2 << SLCD_CFG_CWIDTH_BIT) +#define SLCD_CFG_CS_ACTIVE_LOW (0 << 4) +#define SLCD_CFG_CS_ACTIVE_HIGH (1 << 4) +#define SLCD_CFG_RS_CMD_LOW (0 << 3) +#define SLCD_CFG_RS_CMD_HIGH (1 << 3) +#define SLCD_CFG_CLK_ACTIVE_FALLING (0 << 1) +#define SLCD_CFG_CLK_ACTIVE_RISING (1 << 1) +#define SLCD_CFG_TYPE_PARALLEL (0 << 0) +#define SLCD_CFG_TYPE_SERIAL (1 << 0) + +/* SLCD Control Register */ +#define SLCD_CTRL_DMA_EN (1 << 0) + +/* SLCD Status Register */ +#define SLCD_STATE_BUSY (1 << 0) + +/* SLCD Data Register */ +#define SLCD_DATA_RS_DATA (0 << 31) +#define SLCD_DATA_RS_COMMAND (1 << 31) + +/* SLCD FIFO Register */ +#define SLCD_FIFO_RS_DATA (0 << 31) +#define SLCD_FIFO_RS_COMMAND (1 << 31) + + +/************************************************************************* + * LCD (LCD Controller) + *************************************************************************/ +#define LCD_CFG (LCD_BASE + 0x00) /* LCD Configure Register */ +#define LCD_VSYNC (LCD_BASE + 0x04) /* Vertical Synchronize Register */ +#define LCD_HSYNC (LCD_BASE + 0x08) /* Horizontal Synchronize Register */ +#define LCD_VAT (LCD_BASE + 0x0c) /* Virtual Area Setting Register */ +#define LCD_DAH (LCD_BASE + 0x10) /* Display Area Horizontal Start/End Point */ +#define LCD_DAV (LCD_BASE + 0x14) /* Display Area Vertical Start/End Point */ +#define LCD_PS (LCD_BASE + 0x18) /* PS Signal Setting */ +#define LCD_CLS (LCD_BASE + 0x1c) /* CLS Signal Setting */ +#define LCD_SPL (LCD_BASE + 0x20) /* SPL Signal Setting */ +#define LCD_REV (LCD_BASE + 0x24) /* REV Signal Setting */ +#define LCD_CTRL (LCD_BASE + 0x30) /* LCD Control Register */ +#define LCD_STATE (LCD_BASE + 0x34) /* LCD Status Register */ +#define LCD_IID (LCD_BASE + 0x38) /* Interrupt ID Register */ +#define LCD_DA0 (LCD_BASE + 0x40) /* Descriptor Address Register 0 */ +#define LCD_SA0 (LCD_BASE + 0x44) /* Source Address Register 0 */ +#define LCD_FID0 (LCD_BASE + 0x48) /* Frame ID Register 0 */ +#define LCD_CMD0 (LCD_BASE + 0x4c) /* DMA Command Register 0 */ +#define LCD_DA1 (LCD_BASE + 0x50) /* Descriptor Address Register 1 */ +#define LCD_SA1 (LCD_BASE + 0x54) /* Source Address Register 1 */ +#define LCD_FID1 (LCD_BASE + 0x58) /* Frame ID Register 1 */ +#define LCD_CMD1 (LCD_BASE + 0x5c) /* DMA Command Register 1 */ + +#define REG_LCD_CFG REG32(LCD_CFG) +#define REG_LCD_VSYNC REG32(LCD_VSYNC) +#define REG_LCD_HSYNC REG32(LCD_HSYNC) +#define REG_LCD_VAT REG32(LCD_VAT) +#define REG_LCD_DAH REG32(LCD_DAH) +#define REG_LCD_DAV REG32(LCD_DAV) +#define REG_LCD_PS REG32(LCD_PS) +#define REG_LCD_CLS REG32(LCD_CLS) +#define REG_LCD_SPL REG32(LCD_SPL) +#define REG_LCD_REV REG32(LCD_REV) +#define REG_LCD_CTRL REG32(LCD_CTRL) +#define REG_LCD_STATE REG32(LCD_STATE) +#define REG_LCD_IID REG32(LCD_IID) +#define REG_LCD_DA0 REG32(LCD_DA0) +#define REG_LCD_SA0 REG32(LCD_SA0) +#define REG_LCD_FID0 REG32(LCD_FID0) +#define REG_LCD_CMD0 REG32(LCD_CMD0) +#define REG_LCD_DA1 REG32(LCD_DA1) +#define REG_LCD_SA1 REG32(LCD_SA1) +#define REG_LCD_FID1 REG32(LCD_FID1) +#define REG_LCD_CMD1 REG32(LCD_CMD1) + +/* LCD Configure Register */ +#define LCD_CFG_LCDPIN_BIT 31 /* LCD pins selection */ +#define LCD_CFG_LCDPIN_MASK (0x1 << LCD_CFG_LCDPIN_BIT) + #define LCD_CFG_LCDPIN_LCD (0x0 << LCD_CFG_LCDPIN_BIT) + #define LCD_CFG_LCDPIN_SLCD (0x1 << LCD_CFG_LCDPIN_BIT) +#define LCD_CFG_PSM (1 << 23) /* PS signal mode */ +#define LCD_CFG_CLSM (1 << 22) /* CLS signal mode */ +#define LCD_CFG_SPLM (1 << 21) /* SPL signal mode */ +#define LCD_CFG_REVM (1 << 20) /* REV signal mode */ +#define LCD_CFG_HSYNM (1 << 19) /* HSYNC signal mode */ +#define LCD_CFG_PCLKM (1 << 18) /* PCLK signal mode */ +#define LCD_CFG_INVDAT (1 << 17) /* Inverse output data */ +#define LCD_CFG_SYNDIR_IN (1 << 16) /* VSYNC&HSYNC direction */ +#define LCD_CFG_PSP (1 << 15) /* PS pin reset state */ +#define LCD_CFG_CLSP (1 << 14) /* CLS pin reset state */ +#define LCD_CFG_SPLP (1 << 13) /* SPL pin reset state */ +#define LCD_CFG_REVP (1 << 12) /* REV pin reset state */ +#define LCD_CFG_HSP (1 << 11) /* HSYNC pority:0-active high,1-active low */ +#define LCD_CFG_PCP (1 << 10) /* PCLK pority:0-rising,1-falling */ +#define LCD_CFG_DEP (1 << 9) /* DE pority:0-active high,1-active low */ +#define LCD_CFG_VSP (1 << 8) /* VSYNC pority:0-rising,1-falling */ +#define LCD_CFG_PDW_BIT 4 /* STN pins utilization */ +#define LCD_CFG_PDW_MASK (0x3 << LCD_DEV_PDW_BIT) +#define LCD_CFG_PDW_1 (0 << LCD_CFG_PDW_BIT) /* LCD_D[0] */ + #define LCD_CFG_PDW_2 (1 << LCD_CFG_PDW_BIT) /* LCD_D[0:1] */ + #define LCD_CFG_PDW_4 (2 << LCD_CFG_PDW_BIT) /* LCD_D[0:3]/LCD_D[8:11] */ + #define LCD_CFG_PDW_8 (3 << LCD_CFG_PDW_BIT) /* LCD_D[0:7]/LCD_D[8:15] */ +#define LCD_CFG_MODE_BIT 0 /* Display Device Mode Select */ +#define LCD_CFG_MODE_MASK (0x0f << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_GENERIC_TFT (0 << LCD_CFG_MODE_BIT) /* 16,18 bit TFT */ + #define LCD_CFG_MODE_SPECIAL_TFT_1 (1 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SPECIAL_TFT_2 (2 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SPECIAL_TFT_3 (3 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_NONINTER_CCIR656 (4 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_INTER_CCIR656 (5 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SINGLE_CSTN (8 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SINGLE_MSTN (9 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_DUAL_CSTN (10 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_DUAL_MSTN (11 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SERIAL_TFT (12 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_GENERIC_18BIT_TFT (13 << LCD_CFG_MODE_BIT) + /* JZ47XX defines */ + #define LCD_CFG_MODE_SHARP_HR (1 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_CASIO_TFT (2 << LCD_CFG_MODE_BIT) + #define LCD_CFG_MODE_SAMSUNG_ALPHA (3 << LCD_CFG_MODE_BIT) + + + +/* Vertical Synchronize Register */ +#define LCD_VSYNC_VPS_BIT 16 /* VSYNC pulse start in line clock, fixed to 0 */ +#define LCD_VSYNC_VPS_MASK (0xffff << LCD_VSYNC_VPS_BIT) +#define LCD_VSYNC_VPE_BIT 0 /* VSYNC pulse end in line clock */ +#define LCD_VSYNC_VPE_MASK (0xffff << LCD_VSYNC_VPS_BIT) + +/* Horizontal Synchronize Register */ +#define LCD_HSYNC_HPS_BIT 16 /* HSYNC pulse start position in dot clock */ +#define LCD_HSYNC_HPS_MASK (0xffff << LCD_HSYNC_HPS_BIT) +#define LCD_HSYNC_HPE_BIT 0 /* HSYNC pulse end position in dot clock */ +#define LCD_HSYNC_HPE_MASK (0xffff << LCD_HSYNC_HPE_BIT) + +/* Virtual Area Setting Register */ +#define LCD_VAT_HT_BIT 16 /* Horizontal Total size in dot clock */ +#define LCD_VAT_HT_MASK (0xffff << LCD_VAT_HT_BIT) +#define LCD_VAT_VT_BIT 0 /* Vertical Total size in dot clock */ +#define LCD_VAT_VT_MASK (0xffff << LCD_VAT_VT_BIT) + +/* Display Area Horizontal Start/End Point Register */ +#define LCD_DAH_HDS_BIT 16 /* Horizontal display area start in dot clock */ +#define LCD_DAH_HDS_MASK (0xffff << LCD_DAH_HDS_BIT) +#define LCD_DAH_HDE_BIT 0 /* Horizontal display area end in dot clock */ +#define LCD_DAH_HDE_MASK (0xffff << LCD_DAH_HDE_BIT) + +/* Display Area Vertical Start/End Point Register */ +#define LCD_DAV_VDS_BIT 16 /* Vertical display area start in line clock */ +#define LCD_DAV_VDS_MASK (0xffff << LCD_DAV_VDS_BIT) +#define LCD_DAV_VDE_BIT 0 /* Vertical display area end in line clock */ +#define LCD_DAV_VDE_MASK (0xffff << LCD_DAV_VDE_BIT) + +/* PS Signal Setting */ +#define LCD_PS_PSS_BIT 16 /* PS signal start position in dot clock */ +#define LCD_PS_PSS_MASK (0xffff << LCD_PS_PSS_BIT) +#define LCD_PS_PSE_BIT 0 /* PS signal end position in dot clock */ +#define LCD_PS_PSE_MASK (0xffff << LCD_PS_PSE_BIT) + +/* CLS Signal Setting */ +#define LCD_CLS_CLSS_BIT 16 /* CLS signal start position in dot clock */ +#define LCD_CLS_CLSS_MASK (0xffff << LCD_CLS_CLSS_BIT) +#define LCD_CLS_CLSE_BIT 0 /* CLS signal end position in dot clock */ +#define LCD_CLS_CLSE_MASK (0xffff << LCD_CLS_CLSE_BIT) + +/* SPL Signal Setting */ +#define LCD_SPL_SPLS_BIT 16 /* SPL signal start position in dot clock */ +#define LCD_SPL_SPLS_MASK (0xffff << LCD_SPL_SPLS_BIT) +#define LCD_SPL_SPLE_BIT 0 /* SPL signal end position in dot clock */ +#define LCD_SPL_SPLE_MASK (0xffff << LCD_SPL_SPLE_BIT) + +/* REV Signal Setting */ +#define LCD_REV_REVS_BIT 16 /* REV signal start position in dot clock */ +#define LCD_REV_REVS_MASK (0xffff << LCD_REV_REVS_BIT) + +/* LCD Control Register */ +#define LCD_CTRL_BST_BIT 28 /* Burst Length Selection */ +#define LCD_CTRL_BST_MASK (0x03 << LCD_CTRL_BST_BIT) + #define LCD_CTRL_BST_4 (0 << LCD_CTRL_BST_BIT) /* 4-word */ + #define LCD_CTRL_BST_8 (1 << LCD_CTRL_BST_BIT) /* 8-word */ + #define LCD_CTRL_BST_16 (2 << LCD_CTRL_BST_BIT) /* 16-word */ +#define LCD_CTRL_RGB565 (0 << 27) /* RGB565 mode */ +#define LCD_CTRL_RGB555 (1 << 27) /* RGB555 mode */ +#define LCD_CTRL_OFUP (1 << 26) /* Output FIFO underrun protection enable */ +#define LCD_CTRL_FRC_BIT 24 /* STN FRC Algorithm Selection */ +#define LCD_CTRL_FRC_MASK (0x03 << LCD_CTRL_FRC_BIT) + #define LCD_CTRL_FRC_16 (0 << LCD_CTRL_FRC_BIT) /* 16 grayscale */ + #define LCD_CTRL_FRC_4 (1 << LCD_CTRL_FRC_BIT) /* 4 grayscale */ + #define LCD_CTRL_FRC_2 (2 << LCD_CTRL_FRC_BIT) /* 2 grayscale */ +#define LCD_CTRL_PDD_BIT 16 /* Load Palette Delay Counter */ +#define LCD_CTRL_PDD_MASK (0xff << LCD_CTRL_PDD_BIT) +#define LCD_CTRL_EOFM (1 << 13) /* EOF interrupt mask */ +#define LCD_CTRL_SOFM (1 << 12) /* SOF interrupt mask */ +#define LCD_CTRL_OFUM (1 << 11) /* Output FIFO underrun interrupt mask */ +#define LCD_CTRL_IFUM0 (1 << 10) /* Input FIFO 0 underrun interrupt mask */ +#define LCD_CTRL_IFUM1 (1 << 9) /* Input FIFO 1 underrun interrupt mask */ +#define LCD_CTRL_LDDM (1 << 8) /* LCD disable done interrupt mask */ +#define LCD_CTRL_QDM (1 << 7) /* LCD quick disable done interrupt mask */ +#define LCD_CTRL_BEDN (1 << 6) /* Endian selection */ +#define LCD_CTRL_PEDN (1 << 5) /* Endian in byte:0-msb first, 1-lsb first */ +#define LCD_CTRL_DIS (1 << 4) /* Disable indicate bit */ +#define LCD_CTRL_ENA (1 << 3) /* LCD enable bit */ +#define LCD_CTRL_BPP_BIT 0 /* Bits Per Pixel */ +#define LCD_CTRL_BPP_MASK (0x07 << LCD_CTRL_BPP_BIT) + #define LCD_CTRL_BPP_1 (0 << LCD_CTRL_BPP_BIT) /* 1 bpp */ + #define LCD_CTRL_BPP_2 (1 << LCD_CTRL_BPP_BIT) /* 2 bpp */ + #define LCD_CTRL_BPP_4 (2 << LCD_CTRL_BPP_BIT) /* 4 bpp */ + #define LCD_CTRL_BPP_8 (3 << LCD_CTRL_BPP_BIT) /* 8 bpp */ + #define LCD_CTRL_BPP_16 (4 << LCD_CTRL_BPP_BIT) /* 15/16 bpp */ + #define LCD_CTRL_BPP_18_24 (5 << LCD_CTRL_BPP_BIT) /* 18/24/32 bpp */ + +/* LCD Status Register */ +#define LCD_STATE_QD (1 << 7) /* Quick Disable Done */ +#define LCD_STATE_EOF (1 << 5) /* EOF Flag */ +#define LCD_STATE_SOF (1 << 4) /* SOF Flag */ +#define LCD_STATE_OFU (1 << 3) /* Output FIFO Underrun */ +#define LCD_STATE_IFU0 (1 << 2) /* Input FIFO 0 Underrun */ +#define LCD_STATE_IFU1 (1 << 1) /* Input FIFO 1 Underrun */ +#define LCD_STATE_LDD (1 << 0) /* LCD Disabled */ + +/* DMA Command Register */ +#define LCD_CMD_SOFINT (1 << 31) +#define LCD_CMD_EOFINT (1 << 30) +#define LCD_CMD_PAL (1 << 28) +#define LCD_CMD_LEN_BIT 0 +#define LCD_CMD_LEN_MASK (0xffffff << LCD_CMD_LEN_BIT) + + +/************************************************************************* + * USB Device + *************************************************************************/ +#define USB_BASE UDC_BASE + +#define USB_REG_FADDR (USB_BASE + 0x00) /* Function Address 8-bit */ +#define USB_REG_POWER (USB_BASE + 0x01) /* Power Managemetn 8-bit */ +#define USB_REG_INTRIN (USB_BASE + 0x02) /* Interrupt IN 16-bit */ +#define USB_REG_INTROUT (USB_BASE + 0x04) /* Interrupt OUT 16-bit */ +#define USB_REG_INTRINE (USB_BASE + 0x06) /* Intr IN enable 16-bit */ +#define USB_REG_INTROUTE (USB_BASE + 0x08) /* Intr OUT enable 16-bit */ +#define USB_REG_INTRUSB (USB_BASE + 0x0a) /* Interrupt USB 8-bit */ +#define USB_REG_INTRUSBE (USB_BASE + 0x0b) /* Interrupt USB Enable 8-bit */ +#define USB_REG_FRAME (USB_BASE + 0x0c) /* Frame number 16-bit */ +#define USB_REG_INDEX (USB_BASE + 0x0e) /* Index register 8-bit */ +#define USB_REG_TESTMODE (USB_BASE + 0x0f) /* USB test mode 8-bit */ + +#define USB_REG_CSR0 (USB_BASE + 0x12) /* EP0 CSR 8-bit */ +#define USB_REG_COUNT0 (USB_BASE + 0x18) /* bytes in EP0 FIFO 16-bit */ +#define USB_REG_INMAXP (USB_BASE + 0x10) /* EP1-2 IN Max Pkt Size 16-bit */ +#define USB_REG_INCSR (USB_BASE + 0x12) /* EP1-2 IN CSR LSB 8/16bit */ +#define USB_REG_INCSRH (USB_BASE + 0x13) /* EP1-2 IN CSR MSB 8-bit */ +#define USB_REG_OUTMAXP (USB_BASE + 0x14) /* EP1 OUT Max Pkt Size 16-bit */ +#define USB_REG_OUTCSR (USB_BASE + 0x16) /* EP1 OUT CSR LSB 8/16bit */ +#define USB_REG_OUTCSRH (USB_BASE + 0x17) /* EP1 OUT CSR MSB 8-bit */ +#define USB_REG_OUTCOUNT (USB_BASE + 0x18) /* bytes in EP0/1 OUT FIFO 16-bit */ + +#define USB_FIFO_EP0 (USB_BASE + 0x20) +#define USB_FIFO_EP1 (USB_BASE + 0x24) +#define USB_FIFO_EP2 (USB_BASE + 0x28) + +#define USB_REG_EPINFO (USB_BASE + 0x78) /* Endpoint information */ +#define USB_REG_RAMINFO (USB_BASE + 0x79) /* RAM information */ + +#define USB_REG_INTR (USB_BASE + 0x200) /* DMA pending interrupts 8-bit */ +#define USB_REG_CNTL1 (USB_BASE + 0x204) /* DMA channel 1 control 32-bit */ +#define USB_REG_ADDR1 (USB_BASE + 0x208) /* DMA channel 1 AHB memory addr 32-bit */ +#define USB_REG_COUNT1 (USB_BASE + 0x20c) /* DMA channel 1 byte count 32-bit */ +#define USB_REG_CNTL2 (USB_BASE + 0x214) /* DMA channel 2 control 32-bit */ +#define USB_REG_ADDR2 (USB_BASE + 0x218) /* DMA channel 2 AHB memory addr 32-bit */ +#define USB_REG_COUNT2 (USB_BASE + 0x21c) /* DMA channel 2 byte count 32-bit */ + +#define REG_USB_REG_FADDR REG8(USB_REG_FADDR) +#define REG_USB_REG_POWER REG8(USB_REG_POWER) +#define REG_USB_REG_INTRIN REG16(USB_REG_INTRIN) +#define REG_USB_REG_INTROUT REG16(USB_REG_INTROUT) +#define REG_USB_REG_INTRINE REG16(USB_REG_INTRINE) +#define REG_USB_REG_INTROUTE REG16(USB_REG_INTROUTE) +#define REG_USB_REG_INTRUSB REG8(USB_REG_INTRUSB) +#define REG_USB_REG_INTRUSBE REG8(USB_REG_INTRUSBE) +#define REG_USB_REG_FRAME REG16(USB_REG_FRAME) +#define REG_USB_REG_INDEX REG8(USB_REG_INDEX) +#define REG_USB_REG_TESTMODE REG8(USB_REG_TESTMODE) + +#define REG_USB_REG_CSR0 REG8(USB_REG_CSR0) +#define REG_USB_REG_COUNT0 REG16(USB_REG_COUNT0) +#define REG_USB_REG_INMAXP REG16(USB_REG_INMAXP) +#define REG_USB_REG_INCSR REG16(USB_REG_INCSR) +#define REG_USB_REG_INCSRH REG8(USB_REG_INCSRH) +#define REG_USB_REG_OUTMAXP REG16(USB_REG_OUTMAXP) +#define REG_USB_REG_OUTCSR REG16(USB_REG_OUTCSR) +#define REG_USB_REG_OUTCSRH REG8(USB_REG_OUTCSRH) +#define REG_USB_REG_OUTCOUNT REG16(USB_REG_OUTCOUNT) + +#define REG_USB_FIFO_EP0 REG32(USB_FIFO_EP0) +#define REG_USB_FIFO_EP1 REG32(USB_FIFO_EP1) +#define REG_USB_FIFO_EP2 REG32(USB_FIFO_EP2) + +#define REG_USB_REG_INTR REG8(USB_REG_INTR) +#define REG_USB_REG_CNTL1 REG32(USB_REG_CNTL1) +#define REG_USB_REG_ADDR1 REG32(USB_REG_ADDR1) +#define REG_USB_REG_COUNT1 REG32(USB_REG_COUNT1) +#define REG_USB_REG_CNTL2 REG32(USB_REG_CNTL2) +#define REG_USB_REG_ADDR2 REG32(USB_REG_ADDR2) +#define REG_USB_REG_COUNT2 REG32(USB_REG_COUNT2) + +#define REG_USB_REG_EPINFO REG16(USB_REG_EPINFO) +#define REG_USB_REG_RAMINFO REG8(USB_REG_RAMINFO) + + +/* Power register bit masks */ +#define USB_POWER_SUSPENDM 0x01 +#define USB_POWER_RESUME 0x04 +#define USB_POWER_HSMODE 0x10 +#define USB_POWER_HSENAB 0x20 +#define USB_POWER_SOFTCONN 0x40 + +/* Interrupt register bit masks */ +#define USB_INTR_SUSPEND 0x01 +#define USB_INTR_RESUME 0x02 +#define USB_INTR_RESET 0x04 + +#define USB_INTR_EP0 0x0001 +#define USB_INTR_INEP1 0x0002 +#define USB_INTR_INEP2 0x0004 +#define USB_INTR_OUTEP1 0x0002 +#define USB_INTR_OUTEP2 0x0004 + +#define USB_INTR_EP(n) ((n)==0 ? 1 : ((n)*2)) + +/* CSR0 bit masks */ +#define USB_CSR0_OUTPKTRDY 0x01 +#define USB_CSR0_INPKTRDY 0x02 +#define USB_CSR0_SENTSTALL 0x04 +#define USB_CSR0_DATAEND 0x08 +#define USB_CSR0_SETUPEND 0x10 +#define USB_CSR0_SENDSTALL 0x20 +#define USB_CSR0_SVDOUTPKTRDY 0x40 +#define USB_CSR0_SVDSETUPEND 0x80 + +/* Endpoint CSR register bits */ +#define USB_INCSRH_AUTOSET 0x80 +#define USB_INCSRH_ISO 0x40 +#define USB_INCSRH_MODE 0x20 +#define USB_INCSRH_DMAREQENAB 0x10 +#define USB_INCSRH_FRCDATATOG 0x08 +#define USB_INCSRH_DMAREQMODE 0x04 +#define USB_INCSR_CDT 0x40 +#define USB_INCSR_SENTSTALL 0x20 +#define USB_INCSR_SENDSTALL 0x10 +#define USB_INCSR_FF 0x08 +#define USB_INCSR_UNDERRUN 0x04 +#define USB_INCSR_FFNOTEMPT 0x02 +#define USB_INCSR_INPKTRDY 0x01 +#define USB_OUTCSRH_AUTOCLR 0x80 +#define USB_OUTCSRH_ISO 0x40 +#define USB_OUTCSRH_DMAREQENAB 0x20 +#define USB_OUTCSRH_DNYT 0x10 +#define USB_OUTCSRH_DMAREQMODE 0x08 +#define USB_OUTCSR_CDT 0x80 +#define USB_OUTCSR_SENTSTALL 0x40 +#define USB_OUTCSR_SENDSTALL 0x20 +#define USB_OUTCSR_FF 0x10 +#define USB_OUTCSR_DATAERR 0x08 +#define USB_OUTCSR_OVERRUN 0x04 +#define USB_OUTCSR_FFFULL 0x02 +#define USB_OUTCSR_OUTPKTRDY 0x01 + +/* Testmode register bits */ +#define USB_TEST_SE0NAK 0x01 +#define USB_TEST_J 0x02 +#define USB_TEST_K 0x04 +#define USB_TEST_PACKET 0x08 +#define USB_TEST_FORCE_HS 0x10 +#define USB_TEST_FORCE_FS 0x20 +#define USB_TEST_ALL ( USB_TEST_SE0NAK | USB_TEST_J \ + | USB_TEST_K | USB_TEST_PACKET \ + | USB_TEST_FORCE_HS | USB_TEST_FORCE_FS) + +/* DMA control bits */ +#define USB_CNTL_ENA 0x01 +#define USB_CNTL_DIR_IN 0x02 +#define USB_CNTL_MODE_1 0x04 +#define USB_CNTL_INTR_EN 0x08 +#define USB_CNTL_EP(n) ((n) << 4) +#define USB_CNTL_BURST_0 (0 << 9) +#define USB_CNTL_BURST_4 (1 << 9) +#define USB_CNTL_BURST_8 (2 << 9) +#define USB_CNTL_BURST_16 (3 << 9) + +/* DMA interrupt bits */ +#define USB_INTR_DMA_BULKIN 1 +#define USB_INTR_DMA_BULKOUT 2 + + +//---------------------------------------------------------------------- +// +// Module Operation Definitions +// +//---------------------------------------------------------------------- +#ifndef __ASSEMBLY__ + +/*************************************************************************** + * GPIO + ***************************************************************************/ + +//------------------------------------------------------ +// GPIO Pins Description +// +// PORT 0: +// +// PIN/BIT N FUNC0 FUNC1 +// 0 D0 - +// 1 D1 - +// 2 D2 - +// 3 D3 - +// 4 D4 - +// 5 D5 - +// 6 D6 - +// 7 D7 - +// 8 D8 - +// 9 D9 - +// 10 D10 - +// 11 D11 - +// 12 D12 - +// 13 D13 - +// 14 D14 - +// 15 D15 - +// 16 D16 - +// 17 D17 - +// 18 D18 - +// 19 D19 - +// 20 D20 - +// 21 D21 - +// 22 D22 - +// 23 D23 - +// 24 D24 - +// 25 D25 - +// 26 D26 - +// 27 D27 - +// 28 D28 - +// 29 D29 - +// 30 D30 - +// 31 D31 - +// +//------------------------------------------------------ +// PORT 1: +// +// PIN/BIT N FUNC0 FUNC1 +// 0 A0 - +// 1 A1 - +// 2 A2 - +// 3 A3 - +// 4 A4 - +// 5 A5 - +// 6 A6 - +// 7 A7 - +// 8 A8 - +// 9 A9 - +// 10 A10 - +// 11 A11 - +// 12 A12 - +// 13 A13 - +// 14 A14 - +// 15 A15/CL - +// 16 A16/AL - +// 17 LCD_CLS A21 +// 18 LCD_SPL A22 +// 19 DCS# - +// 20 RAS# - +// 21 CAS# - +// 22 RDWE#/BUFD# - +// 23 CKE - +// 24 CKO - +// 25 CS1# - +// 26 CS2# - +// 27 CS3# - +// 28 CS4# - +// 29 RD# - +// 30 WR# - +// 31 WE0# - +// +// Note: PIN15&16 are CL&AL when connecting to NAND flash. +//------------------------------------------------------ +// PORT 2: +// +// PIN/BIT N FUNC0 FUNC1 +// 0 LCD_D0 - +// 1 LCD_D1 - +// 2 LCD_D2 - +// 3 LCD_D3 - +// 4 LCD_D4 - +// 5 LCD_D5 - +// 6 LCD_D6 - +// 7 LCD_D7 - +// 8 LCD_D8 - +// 9 LCD_D9 - +// 10 LCD_D10 - +// 11 LCD_D11 - +// 12 LCD_D12 - +// 13 LCD_D13 - +// 14 LCD_D14 - +// 15 LCD_D15 - +// 16 LCD_D16 - +// 17 LCD_D17 - +// 18 LCD_PCLK - +// 19 LCD_HSYNC - +// 20 LCD_VSYNC - +// 21 LCD_DE - +// 22 LCD_PS A19 +// 23 LCD_REV A20 +// 24 WE1# - +// 25 WE2# - +// 26 WE3# - +// 27 WAIT# - +// 28 FRE# - +// 29 FWE# - +// 30(NOTE:FRB#) - - +// 31 - - +// +// NOTE(1): PIN30 is used for FRB# when connecting to NAND flash. +//------------------------------------------------------ +// PORT 3: +// +// PIN/BIT N FUNC0 FUNC1 +// 0 CIM_D0 - +// 1 CIM_D1 - +// 2 CIM_D2 - +// 3 CIM_D3 - +// 4 CIM_D4 - +// 5 CIM_D5 - +// 6 CIM_D6 - +// 7 CIM_D7 - +// 8 MSC_CMD - +// 9 MSC_CLK - +// 10 MSC_D0 - +// 11 MSC_D1 - +// 12 MSC_D2 - +// 13 MSC_D3 - +// 14 CIM_MCLK - +// 15 CIM_PCLK - +// 16 CIM_VSYNC - +// 17 CIM_HSYNC - +// 18 SSI_CLK SCLK_RSTN +// 19 SSI_CE0# BIT_CLK(AIC) +// 20 SSI_DT SDATA_OUT(AIC) +// 21 SSI_DR SDATA_IN(AIC) +// 22 SSI_CE1#&GPC SYNC(AIC) +// 23 PWM0 I2C_SDA +// 24 PWM1 I2C_SCK +// 25 PWM2 UART0_TxD +// 26 PWM3 UART0_RxD +// 27 PWM4 A17 +// 28 PWM5 A18 +// 29 - - +// 30 PWM6 UART0_CTS/UART1_RxD +// 31 PWM7 UART0_RTS/UART1_TxD +// +////////////////////////////////////////////////////////// + +/* + * p is the port number (0,1,2,3) + * o is the pin offset (0-31) inside the port + * n is the absolute number of a pin (0-127), regardless of the port + */ + +//------------------------------------------- +// Function Pins Mode + +#define __gpio_as_func0(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXFUNS(p) = (1 << o); \ + REG_GPIO_PXSELC(p) = (1 << o); \ +} while (0) + +#define __gpio_as_func1(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXFUNS(p) = (1 << o); \ + REG_GPIO_PXSELS(p) = (1 << o); \ +} while (0) + +/* + * D0 ~ D31, A0 ~ A16, DCS#, RAS#, CAS#, CKE#, + * RDWE#, CKO#, WE0#, WE1#, WE2#, WE3# + */ +#define __gpio_as_sdram_32bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0xffffffff; \ + REG_GPIO_PXSELC(0) = 0xffffffff; \ + REG_GPIO_PXPES(0) = 0xffffffff; \ + REG_GPIO_PXFUNS(1) = 0x81f9ffff; \ + REG_GPIO_PXSELC(1) = 0x81f9ffff; \ + REG_GPIO_PXPES(1) = 0x81f9ffff; \ + REG_GPIO_PXFUNS(2) = 0x07000000; \ + REG_GPIO_PXSELC(2) = 0x07000000; \ + REG_GPIO_PXPES(2) = 0x07000000; \ +} while (0) + +//#ifdef JZ4740_PAVO +#ifdef JZ4740_4740 +/* + * D0 ~ D15, A0 ~ A16, DCS#, RAS#, CAS#, CKE#, + * RDWE#, CKO#, WE0#, WE1#, WE2#, WE3# + */ +#define __gpio_as_sdram_16bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0x0000ffff; \ + REG_GPIO_PXFUNS(0) = 0x0000ffff; \ + REG_GPIO_PXPES(0) = 0x0000ffff; \ + REG_GPIO_PXFUNS(1) = 0x81f9ffff; \ + REG_GPIO_PXSELC(1) = 0x81f9ffff; \ + REG_GPIO_PXPES(1) = 0x81f9ffff; \ + REG_GPIO_PXFUNS(2) = 0x07000000; \ + REG_GPIO_PXSELC(2) = 0x07000000; \ + REG_GPIO_PXPES(2) = 0x07000000; \ +} while (0) + +#endif + +//#ifdef JZ4740_VIRGO +#ifdef JZ4740_4720 +/* + * D0 ~ D15, A0 ~ A16, DCS#, RAS#, CAS#, CKE#, + * RDWE#, CKO#, WE0#, WE1#, WE2#, WE3# + */ +#define __gpio_as_sdram_16bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0x5442bfaa; \ + REG_GPIO_PXSELC(0) = 0x5442bfaa; \ + REG_GPIO_PXPES(0) = 0x5442bfaa; \ + REG_GPIO_PXFUNS(1) = 0x81f9ffff; \ + REG_GPIO_PXSELC(1) = 0x81f9ffff; \ + REG_GPIO_PXPES(1) = 0x81f9ffff; \ + REG_GPIO_PXFUNS(2) = 0x01000000; \ + REG_GPIO_PXSELC(2) = 0x01000000; \ + REG_GPIO_PXPES(2) = 0x01000000; \ +} while (0) +#endif + + +#ifdef JZ4740_4725 +/* + * D0 ~ D15, A0 ~ A16, DCS#, RAS#, CAS#, CKE#, + * RDWE#, CKO#, WE0#, WE1#, WE2#, WE3# + */ +#define __jz4725__gpio_as_sdram_16bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0x0000ffff; \ + REG_GPIO_PXSELC(0) = 0x0000ffff; \ + REG_GPIO_PXPES(0) = 0x0000ffff; \ + REG_GPIO_PXFUNS(1) = 0x81f9ffff; \ + REG_GPIO_PXSELC(1) = 0x81f9ffff; \ + REG_GPIO_PXPES(1) = 0x81f9ffff; \ + REG_GPIO_PXFUNS(2) = 0x07000000; \ + REG_GPIO_PXSELC(2) = 0x07000000; \ + REG_GPIO_PXPES(2) = 0x07000000; \ +} while (0) +#endif +/* + * CS1#, CLE, ALE, FRE#, FWE#, FRB#, RDWE#/BUFD# + */ +#define __gpio_as_nand() \ +do { \ + REG_GPIO_PXFUNS(1) = 0x02018000; \ + REG_GPIO_PXSELC(1) = 0x02018000; \ + REG_GPIO_PXPES(1) = 0x02018000; \ + REG_GPIO_PXFUNS(2) = 0x30000000; \ + REG_GPIO_PXSELC(2) = 0x30000000; \ + REG_GPIO_PXPES(2) = 0x30000000; \ + REG_GPIO_PXFUNC(2) = 0x40000000; \ + REG_GPIO_PXSELC(2) = 0x40000000; \ + REG_GPIO_PXDIRC(2) = 0x40000000; \ + REG_GPIO_PXPES(2) = 0x40000000; \ + REG_GPIO_PXFUNS(1) = 0x00400000; \ + REG_GPIO_PXSELC(1) = 0x00400000; \ +} while (0) + +/* + * CS4#, RD#, WR#, WAIT#, A0 ~ A22, D0 ~ D7 + */ +#define __gpio_as_nor_8bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0x000000ff; \ + REG_GPIO_PXSELC(0) = 0x000000ff; \ + REG_GPIO_PXPES(0) = 0x000000ff; \ + REG_GPIO_PXFUNS(1) = 0x7041ffff; \ + REG_GPIO_PXSELC(1) = 0x7041ffff; \ + REG_GPIO_PXPES(1) = 0x7041ffff; \ + REG_GPIO_PXFUNS(1) = 0x00060000; \ + REG_GPIO_PXSELS(1) = 0x00060000; \ + REG_GPIO_PXPES(1) = 0x00060000; \ + REG_GPIO_PXFUNS(2) = 0x08000000; \ + REG_GPIO_PXSELC(2) = 0x08000000; \ + REG_GPIO_PXPES(2) = 0x08000000; \ + REG_GPIO_PXFUNS(2) = 0x00c00000; \ + REG_GPIO_PXSELS(2) = 0x00c00000; \ + REG_GPIO_PXPES(2) = 0x00c00000; \ + REG_GPIO_PXFUNS(3) = 0x18000000; \ + REG_GPIO_PXSELS(3) = 0x18000000; \ + REG_GPIO_PXPES(3) = 0x18000000; \ +} while (0) + +/* + * CS4#, RD#, WR#, WAIT#, A0 ~ A22, D0 ~ D15 + */ +#define __gpio_as_nor_16bit() \ +do { \ + REG_GPIO_PXFUNS(0) = 0x0000ffff; \ + REG_GPIO_PXSELC(0) = 0x0000ffff; \ + REG_GPIO_PXPES(0) = 0x0000ffff; \ + REG_GPIO_PXFUNS(1) = 0x7041ffff; \ + REG_GPIO_PXSELC(1) = 0x7041ffff; \ + REG_GPIO_PXPES(1) = 0x7041ffff; \ + REG_GPIO_PXFUNS(1) = 0x00060000; \ + REG_GPIO_PXSELS(1) = 0x00060000; \ + REG_GPIO_PXPES(1) = 0x00060000; \ + REG_GPIO_PXFUNS(2) = 0x08000000; \ + REG_GPIO_PXSELC(2) = 0x08000000; \ + REG_GPIO_PXPES(2) = 0x08000000; \ + REG_GPIO_PXFUNS(2) = 0x00c00000; \ + REG_GPIO_PXSELS(2) = 0x00c00000; \ + REG_GPIO_PXPES(2) = 0x00c00000; \ + REG_GPIO_PXFUNS(3) = 0x18000000; \ + REG_GPIO_PXSELS(3) = 0x18000000; \ + REG_GPIO_PXPES(3) = 0x18000000; \ +} while (0) + +/* + * UART0_TxD, UART_RxD0 + */ +#define __gpio_as_uart0() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x06000000; \ + REG_GPIO_PXSELS(3) = 0x06000000; \ + REG_GPIO_PXPES(3) = 0x06000000; \ +} while (0) + +/* + * UART1_TxD, UART1_RxD1 + */ +#define __gpio_as_uart1() \ +do { \ + REG_GPIO_PXFUNS(3) = 0xc0000000; \ + REG_GPIO_PXSELS(3) = 0xc0000000; \ + REG_GPIO_PXPES(3) = 0xc0000000; \ +} while (0) + +/* + * LCD_D0~LCD_D15, LCD_PCLK, LCD_HSYNC, LCD_VSYNC, LCD_DE + */ +#define __gpio_as_lcd_16bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x003cffff; \ + REG_GPIO_PXSELC(2) = 0x003cffff; \ + REG_GPIO_PXPES(2) = 0x003cffff; \ +} while (0) + +/* + * LCD_D0~LCD_D17, LCD_PCLK, LCD_HSYNC, LCD_VSYNC, LCD_DE + */ +#define __gpio_as_lcd_18bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x003fffff; \ + REG_GPIO_PXSELC(2) = 0x003fffff; \ + REG_GPIO_PXPES(2) = 0x003fffff; \ +} while (0) + + +/* LCD_D0~LCD_D7, SLCD_RS, SLCD_CS */ +#define __gpio_as_slcd_8bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x001800ff; \ + REG_GPIO_PXSELC(2) = 0x001800ff; \ +} while (0) + +/* LCD_D0~LCD_D7, SLCD_RS, SLCD_CS */ +#define __gpio_as_slcd_9bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x001801ff; \ + REG_GPIO_PXSELC(2) = 0x001801ff; \ +} while (0) + +/* LCD_D0~LCD_D15, SLCD_RS, SLCD_CS */ +#define __gpio_as_slcd_16bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x0018ffff; \ + REG_GPIO_PXSELC(2) = 0x0018ffff; \ +} while (0) + +/* LCD_D0~LCD_D17, SLCD_RS, SLCD_CS */ +#define __gpio_as_slcd_18bit() \ +do { \ + REG_GPIO_PXFUNS(2) = 0x001bffff; \ + REG_GPIO_PXSELC(2) = 0x001bffff; \ +} while (0) + +/* + * CIM_D0~CIM_D7, CIM_MCLK, CIM_PCLK, CIM_VSYNC, CIM_HSYNC + */ +#define __gpio_as_cim() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x0003c0ff; \ + REG_GPIO_PXSELC(3) = 0x0003c0ff; \ + REG_GPIO_PXPES(3) = 0x0003c0ff; \ +} while (0) + +/* + * SDATA_OUT, SDATA_IN, BIT_CLK, SYNC, SCLK_RESET + */ +#define __gpio_as_aic() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x007c0000; \ + REG_GPIO_PXSELS(3) = 0x007c0000; \ + REG_GPIO_PXPES(3) = 0x007c0000; \ +} while (0) + +/* + * MSC_CMD, MSC_CLK, MSC_D0 ~ MSC_D3 + */ +#define __gpio_as_msc() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x00003f00; \ + REG_GPIO_PXSELC(3) = 0x00003f00; \ + REG_GPIO_PXPES(3) = 0x00003f00; \ +} while (0) + +/* + * SSI_CS0, SSI_CLK, SSI_DT, SSI_DR + */ +#define __gpio_as_ssi() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x003c0000; \ + REG_GPIO_PXSELC(3) = 0x003c0000; \ + REG_GPIO_PXPES(3) = 0x003c0000; \ +} while (0) + +/* + * I2C_SCK, I2C_SDA + */ +#define __gpio_as_i2c() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x01800000; \ + REG_GPIO_PXSELS(3) = 0x01800000; \ + REG_GPIO_PXPES(3) = 0x01800000; \ +} while (0) + +/* + * PWM0 + */ +#define __gpio_as_pwm0() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x00800000; \ + REG_GPIO_PXSELC(3) = 0x00800000; \ + REG_GPIO_PXPES(3) = 0x00800000; \ +} while (0) + +/* + * PWM1 + */ +#define __gpio_as_pwm1() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x01000000; \ + REG_GPIO_PXSELC(3) = 0x01000000; \ + REG_GPIO_PXPES(3) = 0x01000000; \ +} while (0) + +/* + * PWM2 + */ +#define __gpio_as_pwm2() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x02000000; \ + REG_GPIO_PXSELC(3) = 0x02000000; \ + REG_GPIO_PXPES(3) = 0x02000000; \ +} while (0) + +/* + * PWM3 + */ +#define __gpio_as_pwm3() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x04000000; \ + REG_GPIO_PXSELC(3) = 0x04000000; \ + REG_GPIO_PXPES(3) = 0x04000000; \ +} while (0) + +/* + * PWM4 + */ +#define __gpio_as_pwm4() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x08000000; \ + REG_GPIO_PXSELC(3) = 0x08000000; \ + REG_GPIO_PXPES(3) = 0x08000000; \ +} while (0) + +/* + * PWM5 + */ +#define __gpio_as_pwm5() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x10000000; \ + REG_GPIO_PXSELC(3) = 0x10000000; \ + REG_GPIO_PXPES(3) = 0x10000000; \ +} while (0) + +/* + * PWM6 + */ +#define __gpio_as_pwm6() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x40000000; \ + REG_GPIO_PXSELC(3) = 0x40000000; \ + REG_GPIO_PXPES(3) = 0x40000000; \ +} while (0) + +/* + * PWM7 + */ +#define __gpio_as_pwm7() \ +do { \ + REG_GPIO_PXFUNS(3) = 0x80000000; \ + REG_GPIO_PXSELC(3) = 0x80000000; \ + REG_GPIO_PXPES(3) = 0x80000000; \ +} while (0) + +/* + * n = 0 ~ 7 + */ +#define ___gpio_as_pwm(n) __gpio_as_pwm ## n() +#define __gpio_as_pwm(n) ___gpio_as_pwm(n) + +//------------------------------------------- +// GPIO or Interrupt Mode + +#define __gpio_get_port(p) (REG_GPIO_PXPIN(p)) + +#define __gpio_port_as_output(p, o) \ +do { \ + REG_GPIO_PXFUNC(p) = (1 << (o)); \ + REG_GPIO_PXSELC(p) = (1 << (o)); \ + REG_GPIO_PXDIRS(p) = (1 << (o)); \ +} while (0) + +#define __gpio_port_as_input(p, o) \ +do { \ + REG_GPIO_PXFUNC(p) = (1 << (o)); \ + REG_GPIO_PXSELC(p) = (1 << (o)); \ + REG_GPIO_PXDIRC(p) = (1 << (o)); \ +} while (0) + +#define __gpio_as_output(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + __gpio_port_as_output(p, o); \ +} while (0) + +#define __gpio_as_input(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + __gpio_port_as_input(p, o); \ +} while (0) + +#define __gpio_set_pin(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXDATS(p) = (1 << o); \ +} while (0) + +#define __gpio_clear_pin(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXDATC(p) = (1 << o); \ +} while (0) + +#define __gpio_get_pin(n) \ +({ \ + unsigned int p, o, v; \ + p = (n) / 32; \ + o = (n) % 32; \ + if (__gpio_get_port(p) & (1 << o)) \ + v = 1; \ + else \ + v = 0; \ + v; \ +}) + +#define __gpio_as_irq_high_level(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMS(p) = (1 << o); \ + REG_GPIO_PXTRGC(p) = (1 << o); \ + REG_GPIO_PXFUNC(p) = (1 << o); \ + REG_GPIO_PXSELS(p) = (1 << o); \ + REG_GPIO_PXDIRS(p) = (1 << o); \ + REG_GPIO_PXFLGC(p) = (1 << o); \ + REG_GPIO_PXIMC(p) = (1 << o); \ +} while (0) + +#define __gpio_as_irq_low_level(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMS(p) = (1 << o); \ + REG_GPIO_PXTRGC(p) = (1 << o); \ + REG_GPIO_PXFUNC(p) = (1 << o); \ + REG_GPIO_PXSELS(p) = (1 << o); \ + REG_GPIO_PXDIRC(p) = (1 << o); \ + REG_GPIO_PXFLGC(p) = (1 << o); \ + REG_GPIO_PXIMC(p) = (1 << o); \ +} while (0) + +#define __gpio_as_irq_rise_edge(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMS(p) = (1 << o); \ + REG_GPIO_PXTRGS(p) = (1 << o); \ + REG_GPIO_PXFUNC(p) = (1 << o); \ + REG_GPIO_PXSELS(p) = (1 << o); \ + REG_GPIO_PXDIRS(p) = (1 << o); \ + REG_GPIO_PXFLGC(p) = (1 << o); \ + REG_GPIO_PXIMC(p) = (1 << o); \ +} while (0) + +#define __gpio_as_irq_fall_edge(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMS(p) = (1 << o); \ + REG_GPIO_PXTRGS(p) = (1 << o); \ + REG_GPIO_PXFUNC(p) = (1 << o); \ + REG_GPIO_PXSELS(p) = (1 << o); \ + REG_GPIO_PXDIRC(p) = (1 << o); \ + REG_GPIO_PXFLGC(p) = (1 << o); \ + REG_GPIO_PXIMC(p) = (1 << o); \ +} while (0) + +#define __gpio_mask_irq(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMS(p) = (1 << o); \ +} while (0) + +#define __gpio_unmask_irq(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXIMC(p) = (1 << o); \ +} while (0) + +#define __gpio_ack_irq(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXFLGC(p) = (1 << o); \ +} while (0) + +#define __gpio_get_irq() \ +({ \ + unsigned int p, i, tmp, v = 0; \ + for (p = 3; p >= 0; p--) { \ + tmp = REG_GPIO_PXFLG(p); \ + for (i = 0; i < 32; i++) \ + if (tmp & (1 << i)) \ + v = (32*p + i); \ + } \ + v; \ +}) + +#define __gpio_group_irq(n) \ +({ \ + register int tmp, i; \ + tmp = REG_GPIO_PXFLG((n)); \ + for (i=31;i>=0;i--) \ + if (tmp & (1 << i)) \ + break; \ + i; \ +}) + +#define __gpio_enable_pull(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXPEC(p) = (1 << o); \ +} while (0) + +#define __gpio_disable_pull(n) \ +do { \ + unsigned int p, o; \ + p = (n) / 32; \ + o = (n) % 32; \ + REG_GPIO_PXPES(p) = (1 << o); \ +} while (0) + + +/*************************************************************************** + * CPM + ***************************************************************************/ +#define __cpm_get_pllm() \ + ((REG_CPM_CPPCR & CPM_CPPCR_PLLM_MASK) >> CPM_CPPCR_PLLM_BIT) +#define __cpm_get_plln() \ + ((REG_CPM_CPPCR & CPM_CPPCR_PLLN_MASK) >> CPM_CPPCR_PLLN_BIT) +#define __cpm_get_pllod() \ + ((REG_CPM_CPPCR & CPM_CPPCR_PLLOD_MASK) >> CPM_CPPCR_PLLOD_BIT) + +#define __cpm_get_cdiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_CDIV_MASK) >> CPM_CPCCR_CDIV_BIT) +#define __cpm_get_hdiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_HDIV_MASK) >> CPM_CPCCR_HDIV_BIT) +#define __cpm_get_pdiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_PDIV_MASK) >> CPM_CPCCR_PDIV_BIT) +#define __cpm_get_mdiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_MDIV_MASK) >> CPM_CPCCR_MDIV_BIT) +#define __cpm_get_ldiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_LDIV_MASK) >> CPM_CPCCR_LDIV_BIT) +#define __cpm_get_udiv() \ + ((REG_CPM_CPCCR & CPM_CPCCR_UDIV_MASK) >> CPM_CPCCR_UDIV_BIT) +#define __cpm_get_i2sdiv() \ + ((REG_CPM_I2SCDR & CPM_I2SCDR_I2SDIV_MASK) >> CPM_I2SCDR_I2SDIV_BIT) +#define __cpm_get_pixdiv() \ + ((REG_CPM_LPCDR & CPM_LPCDR_PIXDIV_MASK) >> CPM_LPCDR_PIXDIV_BIT) +#define __cpm_get_mscdiv() \ + ((REG_CPM_MSCCDR & CPM_MSCCDR_MSCDIV_MASK) >> CPM_MSCCDR_MSCDIV_BIT) + +#define __cpm_set_cdiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_CDIV_MASK) | ((v) << (CPM_CPCCR_CDIV_BIT))) +#define __cpm_set_hdiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_HDIV_MASK) | ((v) << (CPM_CPCCR_HDIV_BIT))) +#define __cpm_set_pdiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_PDIV_MASK) | ((v) << (CPM_CPCCR_PDIV_BIT))) +#define __cpm_set_mdiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_MDIV_MASK) | ((v) << (CPM_CPCCR_MDIV_BIT))) +#define __cpm_set_ldiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_LDIV_MASK) | ((v) << (CPM_CPCCR_LDIV_BIT))) +#define __cpm_set_udiv(v) \ + (REG_CPM_CPCCR = (REG_CPM_CPCCR & ~CPM_CPCCR_UDIV_MASK) | ((v) << (CPM_CPCCR_UDIV_BIT))) +#define __cpm_set_i2sdiv(v) \ + (REG_CPM_I2SCDR = (REG_CPM_I2SCDR & ~CPM_I2SCDR_I2SDIV_MASK) | ((v) << (CPM_I2SCDR_I2SDIV_BIT))) +#define __cpm_set_pixdiv(v) \ + (REG_CPM_LPCDR = (REG_CPM_LPCDR & ~CPM_LPCDR_PIXDIV_MASK) | ((v) << (CPM_LPCDR_PIXDIV_BIT))) +#define __cpm_set_mscdiv(v) \ + (REG_CPM_MSCCDR = (REG_CPM_MSCCDR & ~CPM_MSCCDR_MSCDIV_MASK) | ((v) << (CPM_MSCCDR_MSCDIV_BIT))) + +#define __cpm_select_i2sclk_exclk() (REG_CPM_CPCCR &= ~CPM_CPCCR_I2CS) +#define __cpm_select_i2sclk_pll() (REG_CPM_CPCCR |= CPM_CPCCR_I2CS) +#define __cpm_enable_cko() (REG_CPM_CPCCR |= CPM_CPCCR_CLKOEN) +#define __cpm_select_usbclk_exclk() (REG_CPM_CPCCR &= ~CPM_CPCCR_UCS) +#define __cpm_select_usbclk_pll() (REG_CPM_CPCCR |= CPM_CPCCR_UCS) +#define __cpm_enable_pll_change() (REG_CPM_CPCCR |= CPM_CPCCR_CE) +#define __cpm_pllout_direct() (REG_CPM_CPCCR |= CPM_CPCCR_PCS) +#define __cpm_pllout_div2() (REG_CPM_CPCCR &= ~CPM_CPCCR_PCS) + +#define __cpm_pll_is_on() (REG_CPM_CPPCR & CPM_CPPCR_PLLS) +#define __cpm_pll_bypass() (REG_CPM_CPPCR |= CPM_CPPCR_PLLBP) +#define __cpm_pll_enable() (REG_CPM_CPPCR |= CPM_CPPCR_PLLEN) + +#define __cpm_get_cclk_doze_duty() \ + ((REG_CPM_LCR & CPM_LCR_DOZE_DUTY_MASK) >> CPM_LCR_DOZE_DUTY_BIT) +#define __cpm_set_cclk_doze_duty(v) \ + (REG_CPM_LCR = (REG_CPM_LCR & ~CPM_LCR_DOZE_DUTY_MASK) | ((v) << (CPM_LCR_DOZE_DUTY_BIT))) + +#define __cpm_doze_mode() (REG_CPM_LCR |= CPM_LCR_DOZE_ON) +#define __cpm_idle_mode() \ + (REG_CPM_LCR = (REG_CPM_LCR & ~CPM_LCR_LPM_MASK) | CPM_LCR_LPM_IDLE) +#define __cpm_sleep_mode() \ + (REG_CPM_LCR = (REG_CPM_LCR & ~CPM_LCR_LPM_MASK) | CPM_LCR_LPM_SLEEP) + +#define __cpm_stop_all() (REG_CPM_CLKGR = 0xffff) +#define __cpm_stop_uart1() (REG_CPM_CLKGR |= CPM_CLKGR_UART1) +#define __cpm_stop_uhc() (REG_CPM_CLKGR |= CPM_CLKGR_UHC) +#define __cpm_stop_ipu() (REG_CPM_CLKGR |= CPM_CLKGR_IPU) +#define __cpm_stop_dmac() (REG_CPM_CLKGR |= CPM_CLKGR_DMAC) +#define __cpm_stop_udc() (REG_CPM_CLKGR |= CPM_CLKGR_UDC) +#define __cpm_stop_lcd() (REG_CPM_CLKGR |= CPM_CLKGR_LCD) +#define __cpm_stop_cim() (REG_CPM_CLKGR |= CPM_CLKGR_CIM) +#define __cpm_stop_sadc() (REG_CPM_CLKGR |= CPM_CLKGR_SADC) +#define __cpm_stop_msc() (REG_CPM_CLKGR |= CPM_CLKGR_MSC) +#define __cpm_stop_aic1() (REG_CPM_CLKGR |= CPM_CLKGR_AIC1) +#define __cpm_stop_aic2() (REG_CPM_CLKGR |= CPM_CLKGR_AIC2) +#define __cpm_stop_ssi() (REG_CPM_CLKGR |= CPM_CLKGR_SSI) +#define __cpm_stop_i2c() (REG_CPM_CLKGR |= CPM_CLKGR_I2C) +#define __cpm_stop_rtc() (REG_CPM_CLKGR |= CPM_CLKGR_RTC) +#define __cpm_stop_tcu() (REG_CPM_CLKGR |= CPM_CLKGR_TCU) +#define __cpm_stop_uart0() (REG_CPM_CLKGR |= CPM_CLKGR_UART0) + +#define __cpm_start_all() (REG_CPM_CLKGR = 0x0) +#define __cpm_start_uart1() (REG_CPM_CLKGR &= ~CPM_CLKGR_UART1) +#define __cpm_start_uhc() (REG_CPM_CLKGR &= ~CPM_CLKGR_UHC) +#define __cpm_start_ipu() (REG_CPM_CLKGR &= ~CPM_CLKGR_IPU) +#define __cpm_start_dmac() (REG_CPM_CLKGR &= ~CPM_CLKGR_DMAC) +#define __cpm_start_udc() (REG_CPM_CLKGR &= ~CPM_CLKGR_UDC) +#define __cpm_start_lcd() (REG_CPM_CLKGR &= ~CPM_CLKGR_LCD) +#define __cpm_start_cim() (REG_CPM_CLKGR &= ~CPM_CLKGR_CIM) +#define __cpm_start_sadc() (REG_CPM_CLKGR &= ~CPM_CLKGR_SADC) +#define __cpm_start_msc() (REG_CPM_CLKGR &= ~CPM_CLKGR_MSC) +#define __cpm_start_aic1() (REG_CPM_CLKGR &= ~CPM_CLKGR_AIC1) +#define __cpm_start_aic2() (REG_CPM_CLKGR &= ~CPM_CLKGR_AIC2) +#define __cpm_start_ssi() (REG_CPM_CLKGR &= ~CPM_CLKGR_SSI) +#define __cpm_start_i2c() (REG_CPM_CLKGR &= ~CPM_CLKGR_I2C) +#define __cpm_start_rtc() (REG_CPM_CLKGR &= ~CPM_CLKGR_RTC) +#define __cpm_start_tcu() (REG_CPM_CLKGR &= ~CPM_CLKGR_TCU) +#define __cpm_start_uart0() (REG_CPM_CLKGR &= ~CPM_CLKGR_UART0) + +#define __cpm_get_o1st() \ + ((REG_CPM_SCR & CPM_SCR_O1ST_MASK) >> CPM_SCR_O1ST_BIT) +#define __cpm_set_o1st(v) \ + (REG_CPM_SCR = (REG_CPM_SCR & ~CPM_SCR_O1ST_MASK) | ((v) << (CPM_SCR_O1ST_BIT))) +#define __cpm_suspend_usbphy() (REG_CPM_SCR |= CPM_SCR_USBPHY_SUSPEND) +#define __cpm_suspend_usbhost() (REG_CPM_SCR |= CPM_SCR_USBHOST_SUSPEND) +#define __cpm_enable_osc_in_sleep() (REG_CPM_SCR |= CPM_SCR_OSC_ENABLE) + +#ifdef CFG_EXTAL +#define JZ_EXTAL CFG_EXTAL +#else +#define JZ_EXTAL 3686400 +#warning Default EXTCLK is used! +#endif +#define JZ_EXTAL2 32768 /* RTC clock */ + +/* PLL output frequency */ +static __inline__ unsigned int __cpm_get_pllout(void) +{ + unsigned long m, n, no, pllout; + unsigned long cppcr = REG_CPM_CPPCR; + unsigned long od[4] = {1, 2, 2, 4}; + + if ((cppcr & CPM_CPPCR_PLLEN) && !(cppcr & CPM_CPPCR_PLLBP)) + { + m = __cpm_get_pllm() + 2; + n = __cpm_get_plln() + 2; + no = od[__cpm_get_pllod()]; + pllout = ((JZ_EXTAL) / (n * no)) * m; + } + else + pllout = JZ_EXTAL; + + return pllout; +} + +/* PLL output frequency for MSC/I2S/LCD/USB */ +static __inline__ unsigned int __cpm_get_pllout2(void) +{ + if (REG_CPM_CPCCR & CPM_CPCCR_PCS) + return __cpm_get_pllout(); + else + return __cpm_get_pllout()/2; +} + +/* CPU core clock */ +static __inline__ unsigned int __cpm_get_cclk(void) +{ + int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32}; + + return __cpm_get_pllout() / div[__cpm_get_cdiv()]; +} + +/* AHB system bus clock */ +static __inline__ unsigned int __cpm_get_hclk(void) +{ + int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32}; + + return __cpm_get_pllout() / div[__cpm_get_hdiv()]; +} + +/* Memory bus clock */ +static __inline__ unsigned int __cpm_get_mclk(void) +{ + int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32}; + + return __cpm_get_pllout() / div[__cpm_get_mdiv()]; +} + +/* APB peripheral bus clock */ +static __inline__ unsigned int __cpm_get_pclk(void) +{ + int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32}; + + return __cpm_get_pllout() / div[__cpm_get_pdiv()]; +} + +/* LCDC module clock */ +static __inline__ unsigned int __cpm_get_lcdclk(void) +{ + return __cpm_get_pllout2() / (__cpm_get_ldiv() + 1); +} + +/* LCD pixel clock */ +static __inline__ unsigned int __cpm_get_pixclk(void) +{ + return __cpm_get_pllout2() / (__cpm_get_pixdiv() + 1); +} + +/* I2S clock */ +static __inline__ unsigned int __cpm_get_i2sclk(void) +{ + if (REG_CPM_CPCCR & CPM_CPCCR_I2CS) + return __cpm_get_pllout2() / (__cpm_get_i2sdiv() + 1); + else + return JZ_EXTAL; +} + +/* USB clock */ +static __inline__ unsigned int __cpm_get_usbclk(void) +{ + if (REG_CPM_CPCCR & CPM_CPCCR_UCS) + return __cpm_get_pllout2() / (__cpm_get_udiv() + 1); + else + return JZ_EXTAL; +} + +/* MSC clock */ +static __inline__ unsigned int __cpm_get_mscclk(void) +{ + return __cpm_get_pllout2() / (__cpm_get_mscdiv() + 1); +} + +/* EXTAL clock for UART,I2C,SSI,TCU,USB-PHY */ +static __inline__ unsigned int __cpm_get_extalclk(void) +{ + return JZ_EXTAL; +} + +/* RTC clock for CPM,INTC,RTC,TCU,WDT */ +static __inline__ unsigned int __cpm_get_rtcclk(void) +{ + return JZ_EXTAL2; +} + +/* + * Output 24MHz for SD and 16MHz for MMC. + */ +static __inline__ void __cpm_select_msc_clk(int sd) +{ + unsigned int pllout2 = __cpm_get_pllout2(); + unsigned int div = 0; + + if (sd) + div = pllout2 / 24000000; + else + div = pllout2 / 16000000; + + REG_CPM_MSCCDR = div - 1; +} + +/* + * Output 48MHz for SD and 16MHz for MMC. + */ +static __inline__ void __cpm_select_msc_hs_clk(int sd) +{ + unsigned int pllout2 = __cpm_get_pllout2(); + unsigned int div = 0; + + if (sd) + div = pllout2 / 48000000; + else + div = pllout2 / 16000000; + + REG_CPM_MSCCDR = div - 1; +} + +/*************************************************************************** + * TCU + ***************************************************************************/ +// where 'n' is the TCU channel +#define __tcu_select_extalclk(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~(TCU_TCSR_EXT_EN | TCU_TCSR_RTC_EN | TCU_TCSR_PCK_EN)) | TCU_TCSR_EXT_EN) +#define __tcu_select_rtcclk(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~(TCU_TCSR_EXT_EN | TCU_TCSR_RTC_EN | TCU_TCSR_PCK_EN)) | TCU_TCSR_RTC_EN) +#define __tcu_select_pclk(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~(TCU_TCSR_EXT_EN | TCU_TCSR_RTC_EN | TCU_TCSR_PCK_EN)) | TCU_TCSR_PCK_EN) + +#define __tcu_select_clk_div1(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE1) +#define __tcu_select_clk_div4(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE4) +#define __tcu_select_clk_div16(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE16) +#define __tcu_select_clk_div64(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE64) +#define __tcu_select_clk_div256(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE256) +#define __tcu_select_clk_div1024(n) \ + (REG_TCU_TCSR((n)) = (REG_TCU_TCSR((n)) & ~TCU_TCSR_PRESCALE_MASK) | TCU_TCSR_PRESCALE1024) + +#define __tcu_enable_pwm_output(n) ( REG_TCU_TCSR((n)) |= TCU_TCSR_PWM_EN ) +#define __tcu_disable_pwm_output(n) ( REG_TCU_TCSR((n)) &= ~TCU_TCSR_PWM_EN ) + +#define __tcu_init_pwm_output_high(n) ( REG_TCU_TCSR((n)) |= TCU_TCSR_PWM_INITL_HIGH ) +#define __tcu_init_pwm_output_low(n) ( REG_TCU_TCSR((n)) &= ~TCU_TCSR_PWM_INITL_HIGH ) + +#define __tcu_set_pwm_output_shutdown_graceful(n) ( REG_TCU_TCSR((n)) &= ~TCU_TCSR_PWM_SD ) +#define __tcu_set_pwm_output_shutdown_abrupt(n) ( REG_TCU_TCSR((n)) |= TCU_TCSR_PWM_SD ) + +#define __tcu_start_counter(n) ( REG_TCU_TESR |= (1 << (n)) ) +#define __tcu_stop_counter(n) ( REG_TCU_TECR |= (1 << (n)) ) + +#define __tcu_half_match_flag(n) ( REG_TCU_TFR & (1 << ((n) + 16)) ) +#define __tcu_full_match_flag(n) ( REG_TCU_TFR & (1 << (n)) ) +#define __tcu_set_half_match_flag(n) ( REG_TCU_TFSR = (1 << ((n) + 16)) ) +#define __tcu_set_full_match_flag(n) ( REG_TCU_TFSR = (1 << (n)) ) +#define __tcu_clear_half_match_flag(n) ( REG_TCU_TFCR = (1 << ((n) + 16)) ) +#define __tcu_clear_full_match_flag(n) ( REG_TCU_TFCR = (1 << (n)) ) +#define __tcu_mask_half_match_irq(n) ( REG_TCU_TMSR = (1 << ((n) + 16)) ) +#define __tcu_mask_full_match_irq(n) ( REG_TCU_TMSR = (1 << (n)) ) +#define __tcu_unmask_half_match_irq(n) ( REG_TCU_TMCR = (1 << ((n) + 16)) ) +#define __tcu_unmask_full_match_irq(n) ( REG_TCU_TMCR = (1 << (n)) ) + +#define __tcu_wdt_clock_stopped() ( REG_TCU_TSR & TCU_TSSR_WDTSC ) +#define __tcu_timer_clock_stopped(n) ( REG_TCU_TSR & (1 << (n)) ) + +#define __tcu_start_wdt_clock() ( REG_TCU_TSCR = TCU_TSSR_WDTSC ) +#define __tcu_start_timer_clock(n) ( REG_TCU_TSCR = (1 << (n)) ) + +#define __tcu_stop_wdt_clock() ( REG_TCU_TSSR = TCU_TSSR_WDTSC ) +#define __tcu_stop_timer_clock(n) ( REG_TCU_TSSR = (1 << (n)) ) + +#define __tcu_get_count(n) ( REG_TCU_TCNT((n)) ) +#define __tcu_set_count(n,v) ( REG_TCU_TCNT((n)) = (v) ) +#define __tcu_set_full_data(n,v) ( REG_TCU_TDFR((n)) = (v) ) +#define __tcu_set_half_data(n,v) ( REG_TCU_TDHR((n)) = (v) ) + + +/*************************************************************************** + * WDT + ***************************************************************************/ +#define __wdt_start() ( REG_WDT_TCER |= WDT_TCER_TCEN ) +#define __wdt_stop() ( REG_WDT_TCER &= ~WDT_TCER_TCEN ) +#define __wdt_set_count(v) ( REG_WDT_TCNT = (v) ) +#define __wdt_set_data(v) ( REG_WDT_TDR = (v) ) + +#define __wdt_select_extalclk() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~(WDT_TCSR_EXT_EN | WDT_TCSR_RTC_EN | WDT_TCSR_PCK_EN)) | WDT_TCSR_EXT_EN) +#define __wdt_select_rtcclk() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~(WDT_TCSR_EXT_EN | WDT_TCSR_RTC_EN | WDT_TCSR_PCK_EN)) | WDT_TCSR_RTC_EN) +#define __wdt_select_pclk() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~(WDT_TCSR_EXT_EN | WDT_TCSR_RTC_EN | WDT_TCSR_PCK_EN)) | WDT_TCSR_PCK_EN) + +#define __wdt_select_clk_div1() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE1) +#define __wdt_select_clk_div4() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE4) +#define __wdt_select_clk_div16() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE16) +#define __wdt_select_clk_div64() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE64) +#define __wdt_select_clk_div256() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE256) +#define __wdt_select_clk_div1024() \ + (REG_WDT_TCSR = (REG_WDT_TCSR & ~WDT_TCSR_PRESCALE_MASK) | WDT_TCSR_PRESCALE1024) + + +/*************************************************************************** + * UART + ***************************************************************************/ + +#define __uart_enable() ( REG8(UART0_FCR) |= UARTFCR_UUE | UARTFCR_FE ) +#define __uart_disable() ( REG8(UART0_FCR) = ~UARTFCR_UUE ) + +#define __uart_enable_transmit_irq() ( REG8(UART0_IER) |= UARTIER_TIE ) +#define __uart_disable_transmit_irq() ( REG8(UART0_IER) &= ~UARTIER_TIE ) + +#define __uart_enable_receive_irq() \ + ( REG8(UART0_IER) |= UARTIER_RIE | UARTIER_RLIE | UARTIER_RTIE ) +#define __uart_disable_receive_irq() \ + ( REG8(UART0_IER) &= ~(UARTIER_RIE | UARTIER_RLIE | UARTIER_RTIE) ) + +#define __uart_enable_loopback() ( REG8(UART0_MCR) |= UARTMCR_LOOP ) +#define __uart_disable_loopback() ( REG8(UART0_MCR) &= ~UARTMCR_LOOP ) + +#define __uart_set_8n1() ( REG8(UART0_LCR) = UARTLCR_WLEN_8 ) + +#define __uart_set_baud(devclk, baud) \ + do { \ + REG8(UART0_LCR) |= UARTLCR_DLAB; \ + REG8(UART0_DLLR) = (devclk / 16 / baud) & 0xff; \ + REG8(UART0_DLHR) = ((devclk / 16 / baud) >> 8) & 0xff; \ + REG8(UART0_LCR) &= ~UARTLCR_DLAB; \ + } while (0) + +#define __uart_parity_error() ( (REG8(UART0_LSR) & UARTLSR_PER) != 0 ) +#define __uart_clear_errors() \ + ( REG8(UART0_LSR) &= ~(UARTLSR_ORER | UARTLSR_BRK | UARTLSR_FER | UARTLSR_PER | UARTLSR_RFER) ) + +#define __uart_transmit_fifo_empty() ( (REG8(UART0_LSR) & UARTLSR_TDRQ) != 0 ) +#define __uart_transmit_end() ( (REG8(UART0_LSR) & UARTLSR_TEMT) != 0 ) +#define __uart_transmit_char(ch) ( REG8(UART0_TDR) = (ch) ) +#define __uart_receive_fifo_full() ( (REG8(UART0_LSR) & UARTLSR_DR) != 0 ) +#define __uart_receive_ready() ( (REG8(UART0_LSR) & UARTLSR_DR) != 0 ) +#define __uart_receive_char() REG8(UART0_RDR) +#define __uart_disable_irda() ( REG8(UART0_SIRCR) &= ~(SIRCR_TSIRE | SIRCR_RSIRE) ) +#define __uart_enable_irda() \ + /* Tx high pulse as 0, Rx low pulse as 0 */ \ + ( REG8(UART0_SIRCR) = SIRCR_TSIRE | SIRCR_RSIRE | SIRCR_RXPL | SIRCR_TPWS ) + + +/*************************************************************************** + * DMAC + ***************************************************************************/ + +/* n is the DMA channel (0 - 5) */ + +#define __dmac_enable_module() \ + ( REG_DMAC_DMACR |= DMAC_DMACR_DMAE | DMAC_DMACR_PR_RR ) +#define __dmac_disable_module() \ + ( REG_DMAC_DMACR &= ~DMAC_DMACR_DMAE ) + +/* p=0,1,2,3 */ +#define __dmac_set_priority(p) \ +do { \ + REG_DMAC_DMACR &= ~DMAC_DMACR_PR_MASK; \ + REG_DMAC_DMACR |= ((p) << DMAC_DMACR_PR_BIT); \ +} while (0) + +#define __dmac_test_halt_error() ( REG_DMAC_DMACR & DMAC_DMACR_HLT ) +#define __dmac_test_addr_error() ( REG_DMAC_DMACR & DMAC_DMACR_AR ) + +#define __dmac_enable_descriptor(n) \ + ( REG_DMAC_DCCSR((n)) &= ~DMAC_DCCSR_NDES ) +#define __dmac_disable_descriptor(n) \ + ( REG_DMAC_DCCSR((n)) |= DMAC_DCCSR_NDES ) + +#define __dmac_enable_channel(n) \ + ( REG_DMAC_DCCSR((n)) |= DMAC_DCCSR_EN ) +#define __dmac_disable_channel(n) \ + ( REG_DMAC_DCCSR((n)) &= ~DMAC_DCCSR_EN ) +#define __dmac_channel_enabled(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_EN ) + +#define __dmac_channel_enable_irq(n) \ + ( REG_DMAC_DCMD((n)) |= DMAC_DCMD_TIE ) +#define __dmac_channel_disable_irq(n) \ + ( REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_TIE ) + +#define __dmac_channel_transmit_halt_detected(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_HLT ) +#define __dmac_channel_transmit_end_detected(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_TT ) +#define __dmac_channel_address_error_detected(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_AR ) +#define __dmac_channel_count_terminated_detected(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_CT ) +#define __dmac_channel_descriptor_invalid_detected(n) \ + ( REG_DMAC_DCCSR((n)) & DMAC_DCCSR_INV ) + +#define __dmac_channel_clear_transmit_halt(n) \ + ( REG_DMAC_DCCSR(n) &= ~DMAC_DCCSR_HLT ) +#define __dmac_channel_clear_transmit_end(n) \ + ( REG_DMAC_DCCSR(n) &= ~DMAC_DCCSR_TT ) +#define __dmac_channel_clear_address_error(n) \ + ( REG_DMAC_DCCSR(n) &= ~DMAC_DCCSR_AR ) +#define __dmac_channel_clear_count_terminated(n) \ + ( REG_DMAC_DCCSR((n)) &= ~DMAC_DCCSR_CT ) +#define __dmac_channel_clear_descriptor_invalid(n) \ + ( REG_DMAC_DCCSR((n)) &= ~DMAC_DCCSR_INV ) + +#define __dmac_channel_set_single_mode(n) \ + ( REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_TM ) +#define __dmac_channel_set_block_mode(n) \ + ( REG_DMAC_DCMD((n)) |= DMAC_DCMD_TM ) + +#define __dmac_channel_set_transfer_unit_32bit(n) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DS_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DS_32BIT; \ +} while (0) + +#define __dmac_channel_set_transfer_unit_16bit(n) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DS_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DS_16BIT; \ +} while (0) + +#define __dmac_channel_set_transfer_unit_8bit(n) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DS_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DS_8BIT; \ +} while (0) + +#define __dmac_channel_set_transfer_unit_16byte(n) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DS_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DS_16BYTE; \ +} while (0) + +#define __dmac_channel_set_transfer_unit_32byte(n) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DS_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DS_32BYTE; \ +} while (0) + +/* w=8,16,32 */ +#define __dmac_channel_set_dest_port_width(n,w) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DWDH_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_DWDH_##w; \ +} while (0) + +/* w=8,16,32 */ +#define __dmac_channel_set_src_port_width(n,w) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_SWDH_MASK; \ + REG_DMAC_DCMD((n)) |= DMAC_DCMD_SWDH_##w; \ +} while (0) + +/* v=0-15 */ +#define __dmac_channel_set_rdil(n,v) \ +do { \ + REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_RDIL_MASK; \ + REG_DMAC_DCMD((n)) |= ((v) << DMAC_DCMD_RDIL_BIT); \ +} while (0) + +#define __dmac_channel_dest_addr_fixed(n) \ + ( REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_DAI ) +#define __dmac_channel_dest_addr_increment(n) \ + ( REG_DMAC_DCMD((n)) |= DMAC_DCMD_DAI ) + +#define __dmac_channel_src_addr_fixed(n) \ + ( REG_DMAC_DCMD((n)) &= ~DMAC_DCMD_SAI ) +#define __dmac_channel_src_addr_increment(n) \ + ( REG_DMAC_DCMD((n)) |= DMAC_DCMD_SAI ) + +#define __dmac_channel_set_doorbell(n) \ + ( REG_DMAC_DMADBSR = (1 << (n)) ) + +#define __dmac_channel_irq_detected(n) ( REG_DMAC_DMAIPR & (1 << (n)) ) +#define __dmac_channel_ack_irq(n) ( REG_DMAC_DMAIPR &= ~(1 << (n)) ) + +static __inline__ int __dmac_get_irq(void) +{ + int i; + for (i = 0; i < MAX_DMA_NUM; i++) + if (__dmac_channel_irq_detected(i)) + return i; + return -1; +} + + +/*************************************************************************** + * AIC (AC'97 & I2S Controller) + ***************************************************************************/ + +#define __aic_enable() ( REG_AIC_FR |= AIC_FR_ENB ) +#define __aic_disable() ( REG_AIC_FR &= ~AIC_FR_ENB ) + +#define __aic_select_ac97() ( REG_AIC_FR &= ~AIC_FR_AUSEL ) +#define __aic_select_i2s() ( REG_AIC_FR |= AIC_FR_AUSEL ) + +#define __i2s_as_master() ( REG_AIC_FR |= AIC_FR_BCKD | AIC_FR_SYNCD ) +#define __i2s_as_slave() ( REG_AIC_FR &= ~(AIC_FR_BCKD | AIC_FR_SYNCD) ) +#define __aic_reset_status() ( REG_AIC_FR & AIC_FR_RST ) + +#define __aic_reset() \ +do { \ + REG_AIC_FR |= AIC_FR_RST; \ +} while(0) + + +#define __aic_set_transmit_trigger(n) \ +do { \ + REG_AIC_FR &= ~AIC_FR_TFTH_MASK; \ + REG_AIC_FR |= ((n) << AIC_FR_TFTH_BIT); \ +} while(0) + +#define __aic_set_receive_trigger(n) \ +do { \ + REG_AIC_FR &= ~AIC_FR_RFTH_MASK; \ + REG_AIC_FR |= ((n) << AIC_FR_RFTH_BIT); \ +} while(0) + +#define __aic_enable_record() ( REG_AIC_CR |= AIC_CR_EREC ) +#define __aic_disable_record() ( REG_AIC_CR &= ~AIC_CR_EREC ) +#define __aic_enable_replay() ( REG_AIC_CR |= AIC_CR_ERPL ) +#define __aic_disable_replay() ( REG_AIC_CR &= ~AIC_CR_ERPL ) +#define __aic_enable_loopback() ( REG_AIC_CR |= AIC_CR_ENLBF ) +#define __aic_disable_loopback() ( REG_AIC_CR &= ~AIC_CR_ENLBF ) + +#define __aic_flush_fifo() ( REG_AIC_CR |= AIC_CR_FLUSH ) +#define __aic_unflush_fifo() ( REG_AIC_CR &= ~AIC_CR_FLUSH ) + +#define __aic_enable_transmit_intr() \ + ( REG_AIC_CR |= (AIC_CR_ETFS | AIC_CR_ETUR) ) +#define __aic_disable_transmit_intr() \ + ( REG_AIC_CR &= ~(AIC_CR_ETFS | AIC_CR_ETUR) ) +#define __aic_enable_receive_intr() \ + ( REG_AIC_CR |= (AIC_CR_ERFS | AIC_CR_EROR) ) +#define __aic_disable_receive_intr() \ + ( REG_AIC_CR &= ~(AIC_CR_ERFS | AIC_CR_EROR) ) + +#define __aic_enable_transmit_dma() ( REG_AIC_CR |= AIC_CR_TDMS ) +#define __aic_disable_transmit_dma() ( REG_AIC_CR &= ~AIC_CR_TDMS ) +#define __aic_enable_receive_dma() ( REG_AIC_CR |= AIC_CR_RDMS ) +#define __aic_disable_receive_dma() ( REG_AIC_CR &= ~AIC_CR_RDMS ) + +#define __aic_enable_mono2stereo() ( REG_AIC_CR |= AIC_CR_M2S ) +#define __aic_disable_mono2stereo() ( REG_AIC_CR &= ~AIC_CR_M2S ) +#define __aic_enable_byteswap() ( REG_AIC_CR |= AIC_CR_ENDSW ) +#define __aic_disable_byteswap() ( REG_AIC_CR &= ~AIC_CR_ENDSW ) +#define __aic_enable_unsignadj() ( REG_AIC_CR |= AIC_CR_AVSTSU ) +#define __aic_disable_unsignadj() ( REG_AIC_CR &= ~AIC_CR_AVSTSU ) + +#define AC97_PCM_XS_L_FRONT AIC_ACCR1_XS_SLOT3 +#define AC97_PCM_XS_R_FRONT AIC_ACCR1_XS_SLOT4 +#define AC97_PCM_XS_CENTER AIC_ACCR1_XS_SLOT6 +#define AC97_PCM_XS_L_SURR AIC_ACCR1_XS_SLOT7 +#define AC97_PCM_XS_R_SURR AIC_ACCR1_XS_SLOT8 +#define AC97_PCM_XS_LFE AIC_ACCR1_XS_SLOT9 + +#define AC97_PCM_RS_L_FRONT AIC_ACCR1_RS_SLOT3 +#define AC97_PCM_RS_R_FRONT AIC_ACCR1_RS_SLOT4 +#define AC97_PCM_RS_CENTER AIC_ACCR1_RS_SLOT6 +#define AC97_PCM_RS_L_SURR AIC_ACCR1_RS_SLOT7 +#define AC97_PCM_RS_R_SURR AIC_ACCR1_RS_SLOT8 +#define AC97_PCM_RS_LFE AIC_ACCR1_RS_SLOT9 + +#define __ac97_set_xs_none() ( REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK ) +#define __ac97_set_xs_mono() \ +do { \ + REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK; \ + REG_AIC_ACCR1 |= AC97_PCM_XS_R_FRONT; \ +} while(0) +#define __ac97_set_xs_stereo() \ +do { \ + REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK; \ + REG_AIC_ACCR1 |= AC97_PCM_XS_L_FRONT | AC97_PCM_XS_R_FRONT; \ +} while(0) + +/* In fact, only stereo is support now. */ +#define __ac97_set_rs_none() ( REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK ) +#define __ac97_set_rs_mono() \ +do { \ + REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK; \ + REG_AIC_ACCR1 |= AC97_PCM_RS_R_FRONT; \ +} while(0) +#define __ac97_set_rs_stereo() \ +do { \ + REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK; \ + REG_AIC_ACCR1 |= AC97_PCM_RS_L_FRONT | AC97_PCM_RS_R_FRONT; \ +} while(0) + +#define __ac97_warm_reset_codec() \ + do { \ + REG_AIC_ACCR2 |= AIC_ACCR2_SA; \ + REG_AIC_ACCR2 |= AIC_ACCR2_SS; \ + udelay(2); \ + REG_AIC_ACCR2 &= ~AIC_ACCR2_SS; \ + REG_AIC_ACCR2 &= ~AIC_ACCR2_SA; \ + } while (0) + +#define __ac97_cold_reset_codec() \ + do { \ + REG_AIC_ACCR2 |= AIC_ACCR2_SR; \ + udelay(2); \ + REG_AIC_ACCR2 &= ~AIC_ACCR2_SR; \ + } while (0) + +/* n=8,16,18,20 */ +#define __ac97_set_iass(n) \ + ( REG_AIC_ACCR2 = (REG_AIC_ACCR2 & ~AIC_ACCR2_IASS_MASK) | AIC_ACCR2_IASS_##n##BIT ) +#define __ac97_set_oass(n) \ + ( REG_AIC_ACCR2 = (REG_AIC_ACCR2 & ~AIC_ACCR2_OASS_MASK) | AIC_ACCR2_OASS_##n##BIT ) + +#define __i2s_select_i2s() ( REG_AIC_I2SCR &= ~AIC_I2SCR_AMSL ) +#define __i2s_select_msbjustified() ( REG_AIC_I2SCR |= AIC_I2SCR_AMSL ) + +/* n=8,16,18,20,24 */ +/*#define __i2s_set_sample_size(n) \ + ( REG_AIC_I2SCR |= (REG_AIC_I2SCR & ~AIC_I2SCR_WL_MASK) | AIC_I2SCR_WL_##n##BIT )*/ + +#define __i2s_set_oss_sample_size(n) \ + ( REG_AIC_CR = (REG_AIC_CR & ~AIC_CR_OSS_MASK) | AIC_CR_OSS_##n##BIT ) +#define __i2s_set_iss_sample_size(n) \ + ( REG_AIC_CR = (REG_AIC_CR & ~AIC_CR_ISS_MASK) | AIC_CR_ISS_##n##BIT ) + +#define __i2s_stop_bitclk() ( REG_AIC_I2SCR |= AIC_I2SCR_STPBK ) +#define __i2s_start_bitclk() ( REG_AIC_I2SCR &= ~AIC_I2SCR_STPBK ) + +#define __aic_transmit_request() ( REG_AIC_SR & AIC_SR_TFS ) +#define __aic_receive_request() ( REG_AIC_SR & AIC_SR_RFS ) +#define __aic_transmit_underrun() ( REG_AIC_SR & AIC_SR_TUR ) +#define __aic_receive_overrun() ( REG_AIC_SR & AIC_SR_ROR ) + +#define __aic_clear_errors() ( REG_AIC_SR &= ~(AIC_SR_TUR | AIC_SR_ROR) ) + +#define __aic_get_transmit_resident() \ + ( (REG_AIC_SR & AIC_SR_TFL_MASK) >> AIC_SR_TFL_BIT ) +#define __aic_get_receive_count() \ + ( (REG_AIC_SR & AIC_SR_RFL_MASK) >> AIC_SR_RFL_BIT ) + +#define __ac97_command_transmitted() ( REG_AIC_ACSR & AIC_ACSR_CADT ) +#define __ac97_status_received() ( REG_AIC_ACSR & AIC_ACSR_SADR ) +#define __ac97_status_receive_timeout() ( REG_AIC_ACSR & AIC_ACSR_RSTO ) +#define __ac97_codec_is_low_power_mode() ( REG_AIC_ACSR & AIC_ACSR_CLPM ) +#define __ac97_codec_is_ready() ( REG_AIC_ACSR & AIC_ACSR_CRDY ) +#define __ac97_slot_error_detected() ( REG_AIC_ACSR & AIC_ACSR_SLTERR ) +#define __ac97_clear_slot_error() ( REG_AIC_ACSR &= ~AIC_ACSR_SLTERR ) + +#define __i2s_is_busy() ( REG_AIC_I2SSR & AIC_I2SSR_BSY ) + +#define CODEC_READ_CMD (1 << 19) +#define CODEC_WRITE_CMD (0 << 19) +#define CODEC_REG_INDEX_BIT 12 +#define CODEC_REG_INDEX_MASK (0x7f << CODEC_REG_INDEX_BIT) /* 18:12 */ +#define CODEC_REG_DATA_BIT 4 +#define CODEC_REG_DATA_MASK (0x0ffff << 4) /* 19:4 */ + +#define __ac97_out_rcmd_addr(reg) \ +do { \ + REG_AIC_ACCAR = CODEC_READ_CMD | ((reg) << CODEC_REG_INDEX_BIT); \ +} while (0) + +#define __ac97_out_wcmd_addr(reg) \ +do { \ + REG_AIC_ACCAR = CODEC_WRITE_CMD | ((reg) << CODEC_REG_INDEX_BIT); \ +} while (0) + +#define __ac97_out_data(value) \ +do { \ + REG_AIC_ACCDR = ((value) << CODEC_REG_DATA_BIT); \ +} while (0) + +#define __ac97_in_data() \ + ( (REG_AIC_ACSDR & CODEC_REG_DATA_MASK) >> CODEC_REG_DATA_BIT ) + +#define __ac97_in_status_addr() \ + ( (REG_AIC_ACSAR & CODEC_REG_INDEX_MASK) >> CODEC_REG_INDEX_BIT ) + +#define __i2s_set_sample_rate(i2sclk, sync) \ + ( REG_AIC_I2SDIV = ((i2sclk) / (4*64)) / (sync) ) + +#define __aic_write_tfifo(v) ( REG_AIC_DR = (v) ) +#define __aic_read_rfifo() ( REG_AIC_DR ) + +#define __aic_internal_codec() ( REG_AIC_FR |= AIC_FR_ICDC ) +#define __aic_external_codec() ( REG_AIC_FR &= ~AIC_FR_ICDC ) + +#define AIC_FR_LSMP (1 << 6) +#define __aic_play_lastsample() ( REG_AIC_FR |= AIC_FR_LSMP ) +// +// Define next ops for AC97 compatible +// + +#define AC97_ACSR AIC_ACSR + +#define __ac97_enable() __aic_enable(); __aic_select_ac97() +#define __ac97_disable() __aic_disable() +#define __ac97_reset() __aic_reset() + +#define __ac97_set_transmit_trigger(n) __aic_set_transmit_trigger(n) +#define __ac97_set_receive_trigger(n) __aic_set_receive_trigger(n) + +#define __ac97_enable_record() __aic_enable_record() +#define __ac97_disable_record() __aic_disable_record() +#define __ac97_enable_replay() __aic_enable_replay() +#define __ac97_disable_replay() __aic_disable_replay() +#define __ac97_enable_loopback() __aic_enable_loopback() +#define __ac97_disable_loopback() __aic_disable_loopback() + +#define __ac97_enable_transmit_dma() __aic_enable_transmit_dma() +#define __ac97_disable_transmit_dma() __aic_disable_transmit_dma() +#define __ac97_enable_receive_dma() __aic_enable_receive_dma() +#define __ac97_disable_receive_dma() __aic_disable_receive_dma() + +#define __ac97_transmit_request() __aic_transmit_request() +#define __ac97_receive_request() __aic_receive_request() +#define __ac97_transmit_underrun() __aic_transmit_underrun() +#define __ac97_receive_overrun() __aic_receive_overrun() + +#define __ac97_clear_errors() __aic_clear_errors() + +#define __ac97_get_transmit_resident() __aic_get_transmit_resident() +#define __ac97_get_receive_count() __aic_get_receive_count() + +#define __ac97_enable_transmit_intr() __aic_enable_transmit_intr() +#define __ac97_disable_transmit_intr() __aic_disable_transmit_intr() +#define __ac97_enable_receive_intr() __aic_enable_receive_intr() +#define __ac97_disable_receive_intr() __aic_disable_receive_intr() + +#define __ac97_write_tfifo(v) __aic_write_tfifo(v) +#define __ac97_read_rfifo() __aic_read_rfifo() + +// +// Define next ops for I2S compatible +// + +#define I2S_ACSR AIC_I2SSR + +#define __i2s_enable() __aic_enable(); __aic_select_i2s() +#define __i2s_disable() __aic_disable() +#define __i2s_reset() __aic_reset() + +#define __i2s_set_transmit_trigger(n) __aic_set_transmit_trigger(n) +#define __i2s_set_receive_trigger(n) __aic_set_receive_trigger(n) + +#define __i2s_enable_record() __aic_enable_record() +#define __i2s_disable_record() __aic_disable_record() +#define __i2s_enable_replay() __aic_enable_replay() +#define __i2s_disable_replay() __aic_disable_replay() +#define __i2s_enable_loopback() __aic_enable_loopback() +#define __i2s_disable_loopback() __aic_disable_loopback() + +#define __i2s_enable_transmit_dma() __aic_enable_transmit_dma() +#define __i2s_disable_transmit_dma() __aic_disable_transmit_dma() +#define __i2s_enable_receive_dma() __aic_enable_receive_dma() +#define __i2s_disable_receive_dma() __aic_disable_receive_dma() + +#define __i2s_transmit_request() __aic_transmit_request() +#define __i2s_receive_request() __aic_receive_request() +#define __i2s_transmit_underrun() __aic_transmit_underrun() +#define __i2s_receive_overrun() __aic_receive_overrun() + +#define __i2s_clear_errors() __aic_clear_errors() + +#define __i2s_get_transmit_resident() __aic_get_transmit_resident() +#define __i2s_get_receive_count() __aic_get_receive_count() + +#define __i2s_enable_transmit_intr() __aic_enable_transmit_intr() +#define __i2s_disable_transmit_intr() __aic_disable_transmit_intr() +#define __i2s_enable_receive_intr() __aic_enable_receive_intr() +#define __i2s_disable_receive_intr() __aic_disable_receive_intr() + +#define __i2s_write_tfifo(v) __aic_write_tfifo(v) +#define __i2s_read_rfifo() __aic_read_rfifo() + +#define __i2s_reset_codec() \ + do { \ + } while (0) + + +/*************************************************************************** + * ICDC + ***************************************************************************/ +#define __i2s_internal_codec() __aic_internal_codec() +#define __i2s_external_codec() __aic_external_codec() + +/*************************************************************************** + * INTC + ***************************************************************************/ +#define __intc_unmask_irq(n) ( REG_INTC_IMCR = (1 << (n)) ) +#define __intc_mask_irq(n) ( REG_INTC_IMSR = (1 << (n)) ) +#define __intc_ack_irq(n) ( REG_INTC_IPR = (1 << (n)) ) + + +/*************************************************************************** + * I2C + ***************************************************************************/ + +#define __i2c_enable() ( REG_I2C_CR |= I2C_CR_I2CE ) +#define __i2c_disable() ( REG_I2C_CR &= ~I2C_CR_I2CE ) + +#define __i2c_send_start() ( REG_I2C_CR |= I2C_CR_STA ) +#define __i2c_send_stop() ( REG_I2C_CR |= I2C_CR_STO ) +#define __i2c_send_ack() ( REG_I2C_CR &= ~I2C_CR_AC ) +#define __i2c_send_nack() ( REG_I2C_CR |= I2C_CR_AC ) + +#define __i2c_set_drf() ( REG_I2C_SR |= I2C_SR_DRF ) +#define __i2c_clear_drf() ( REG_I2C_SR &= ~I2C_SR_DRF ) +#define __i2c_check_drf() ( REG_I2C_SR & I2C_SR_DRF ) + +#define __i2c_received_ack() ( !(REG_I2C_SR & I2C_SR_ACKF) ) +#define __i2c_is_busy() ( REG_I2C_SR & I2C_SR_BUSY ) +#define __i2c_transmit_ended() ( REG_I2C_SR & I2C_SR_TEND ) + +#define __i2c_set_clk(dev_clk, i2c_clk) \ + ( REG_I2C_GR = (dev_clk) / (16*(i2c_clk)) - 1 ) + +#define __i2c_read() ( REG_I2C_DR ) +#define __i2c_write(val) ( REG_I2C_DR = (val) ) + + +/*************************************************************************** + * MSC + ***************************************************************************/ + +#define __msc_start_op() \ + ( REG_MSC_STRPCL = MSC_STRPCL_START_OP | MSC_STRPCL_CLOCK_CONTROL_START ) + +#define __msc_set_resto(to) ( REG_MSC_RESTO = to ) +#define __msc_set_rdto(to) ( REG_MSC_RDTO = to ) +#define __msc_set_cmd(cmd) ( REG_MSC_CMD = cmd ) +#define __msc_set_arg(arg) ( REG_MSC_ARG = arg ) +#define __msc_set_nob(nob) ( REG_MSC_NOB = nob ) +#define __msc_get_nob() ( REG_MSC_NOB ) +#define __msc_set_blklen(len) ( REG_MSC_BLKLEN = len ) +#define __msc_set_cmdat(cmdat) ( REG_MSC_CMDAT = cmdat ) +#define __msc_set_cmdat_ioabort() ( REG_MSC_CMDAT |= MSC_CMDAT_IO_ABORT ) +#define __msc_clear_cmdat_ioabort() ( REG_MSC_CMDAT &= ~MSC_CMDAT_IO_ABORT ) + +#define __msc_set_cmdat_bus_width1() \ +do { \ + REG_MSC_CMDAT &= ~MSC_CMDAT_BUS_WIDTH_MASK; \ + REG_MSC_CMDAT |= MSC_CMDAT_BUS_WIDTH_1BIT; \ +} while(0) + +#define __msc_set_cmdat_bus_width4() \ +do { \ + REG_MSC_CMDAT &= ~MSC_CMDAT_BUS_WIDTH_MASK; \ + REG_MSC_CMDAT |= MSC_CMDAT_BUS_WIDTH_4BIT; \ +} while(0) + +#define __msc_set_cmdat_dma_en() ( REG_MSC_CMDAT |= MSC_CMDAT_DMA_EN ) +#define __msc_set_cmdat_init() ( REG_MSC_CMDAT |= MSC_CMDAT_INIT ) +#define __msc_set_cmdat_busy() ( REG_MSC_CMDAT |= MSC_CMDAT_BUSY ) +#define __msc_set_cmdat_stream() ( REG_MSC_CMDAT |= MSC_CMDAT_STREAM_BLOCK ) +#define __msc_set_cmdat_block() ( REG_MSC_CMDAT &= ~MSC_CMDAT_STREAM_BLOCK ) +#define __msc_set_cmdat_read() ( REG_MSC_CMDAT &= ~MSC_CMDAT_WRITE_READ ) +#define __msc_set_cmdat_write() ( REG_MSC_CMDAT |= MSC_CMDAT_WRITE_READ ) +#define __msc_set_cmdat_data_en() ( REG_MSC_CMDAT |= MSC_CMDAT_DATA_EN ) + +/* r is MSC_CMDAT_RESPONSE_FORMAT_Rx or MSC_CMDAT_RESPONSE_FORMAT_NONE */ +#define __msc_set_cmdat_res_format(r) \ +do { \ + REG_MSC_CMDAT &= ~MSC_CMDAT_RESPONSE_FORMAT_MASK; \ + REG_MSC_CMDAT |= (r); \ +} while(0) + +#define __msc_clear_cmdat() \ + REG_MSC_CMDAT &= ~( MSC_CMDAT_IO_ABORT | MSC_CMDAT_DMA_EN | MSC_CMDAT_INIT| \ + MSC_CMDAT_BUSY | MSC_CMDAT_STREAM_BLOCK | MSC_CMDAT_WRITE_READ | \ + MSC_CMDAT_DATA_EN | MSC_CMDAT_RESPONSE_FORMAT_MASK ) + +#define __msc_get_imask() ( REG_MSC_IMASK ) +#define __msc_mask_all_intrs() ( REG_MSC_IMASK = 0xff ) +#define __msc_unmask_all_intrs() ( REG_MSC_IMASK = 0x00 ) +#define __msc_mask_rd() ( REG_MSC_IMASK |= MSC_IMASK_RXFIFO_RD_REQ ) +#define __msc_unmask_rd() ( REG_MSC_IMASK &= ~MSC_IMASK_RXFIFO_RD_REQ ) +#define __msc_mask_wr() ( REG_MSC_IMASK |= MSC_IMASK_TXFIFO_WR_REQ ) +#define __msc_unmask_wr() ( REG_MSC_IMASK &= ~MSC_IMASK_TXFIFO_WR_REQ ) +#define __msc_mask_endcmdres() ( REG_MSC_IMASK |= MSC_IMASK_END_CMD_RES ) +#define __msc_unmask_endcmdres() ( REG_MSC_IMASK &= ~MSC_IMASK_END_CMD_RES ) +#define __msc_mask_datatrandone() ( REG_MSC_IMASK |= MSC_IMASK_DATA_TRAN_DONE ) +#define __msc_unmask_datatrandone() ( REG_MSC_IMASK &= ~MSC_IMASK_DATA_TRAN_DONE ) +#define __msc_mask_prgdone() ( REG_MSC_IMASK |= MSC_IMASK_PRG_DONE ) +#define __msc_unmask_prgdone() ( REG_MSC_IMASK &= ~MSC_IMASK_PRG_DONE ) + +/* n=0,1,2,3,4,5,6,7 */ +#define __msc_set_clkrt(n) \ +do { \ + REG_MSC_CLKRT = n; \ +} while(0) + +#define __msc_get_ireg() ( REG_MSC_IREG ) +#define __msc_ireg_rd() ( REG_MSC_IREG & MSC_IREG_RXFIFO_RD_REQ ) +#define __msc_ireg_wr() ( REG_MSC_IREG & MSC_IREG_TXFIFO_WR_REQ ) +#define __msc_ireg_end_cmd_res() ( REG_MSC_IREG & MSC_IREG_END_CMD_RES ) +#define __msc_ireg_data_tran_done() ( REG_MSC_IREG & MSC_IREG_DATA_TRAN_DONE ) +#define __msc_ireg_prg_done() ( REG_MSC_IREG & MSC_IREG_PRG_DONE ) +#define __msc_ireg_clear_end_cmd_res() ( REG_MSC_IREG = MSC_IREG_END_CMD_RES ) +#define __msc_ireg_clear_data_tran_done() ( REG_MSC_IREG = MSC_IREG_DATA_TRAN_DONE ) +#define __msc_ireg_clear_prg_done() ( REG_MSC_IREG = MSC_IREG_PRG_DONE ) + +#define __msc_get_stat() ( REG_MSC_STAT ) +#define __msc_stat_not_end_cmd_res() ( (REG_MSC_STAT & MSC_STAT_END_CMD_RES) == 0) +#define __msc_stat_crc_err() \ + ( REG_MSC_STAT & (MSC_STAT_CRC_RES_ERR | MSC_STAT_CRC_READ_ERROR | MSC_STAT_CRC_WRITE_ERROR_YES) ) +#define __msc_stat_res_crc_err() ( REG_MSC_STAT & MSC_STAT_CRC_RES_ERR ) +#define __msc_stat_rd_crc_err() ( REG_MSC_STAT & MSC_STAT_CRC_READ_ERROR ) +#define __msc_stat_wr_crc_err() ( REG_MSC_STAT & MSC_STAT_CRC_WRITE_ERROR_YES ) +#define __msc_stat_resto_err() ( REG_MSC_STAT & MSC_STAT_TIME_OUT_RES ) +#define __msc_stat_rdto_err() ( REG_MSC_STAT & MSC_STAT_TIME_OUT_READ ) + +#define __msc_rd_resfifo() ( REG_MSC_RES ) +#define __msc_rd_rxfifo() ( REG_MSC_RXFIFO ) +#define __msc_wr_txfifo(v) ( REG_MSC_TXFIFO = v ) + +#define __msc_reset() \ +do { \ + REG_MSC_STRPCL = MSC_STRPCL_RESET; \ + while (REG_MSC_STAT & MSC_STAT_IS_RESETTING); \ +} while (0) + +#define __msc_start_clk() \ +do { \ + REG_MSC_STRPCL = MSC_STRPCL_CLOCK_CONTROL_START; \ +} while (0) + +#define __msc_stop_clk() \ +do { \ + REG_MSC_STRPCL = MSC_STRPCL_CLOCK_CONTROL_STOP; \ +} while (0) + +#define MMC_CLK 19169200 +#define SD_CLK 24576000 + +/* msc_clk should little than pclk and little than clk retrieve from card */ +#define __msc_calc_clk_divisor(type,dev_clk,msc_clk,lv) \ +do { \ + unsigned int rate, pclk, i; \ + pclk = dev_clk; \ + rate = type?SD_CLK:MMC_CLK; \ + if (msc_clk && msc_clk < pclk) \ + pclk = msc_clk; \ + i = 0; \ + while (pclk < rate) \ + { \ + i ++; \ + rate >>= 1; \ + } \ + lv = i; \ +} while(0) + +/* divide rate to little than or equal to 400kHz */ +#define __msc_calc_slow_clk_divisor(type, lv) \ +do { \ + unsigned int rate, i; \ + rate = (type?SD_CLK:MMC_CLK)/1000/400; \ + i = 0; \ + while (rate > 0) \ + { \ + rate >>= 1; \ + i ++; \ + } \ + lv = i; \ +} while(0) + + +/*************************************************************************** + * SSI + ***************************************************************************/ + +#define __ssi_enable() ( REG_SSI_CR0 |= SSI_CR0_SSIE ) +#define __ssi_disable() ( REG_SSI_CR0 &= ~SSI_CR0_SSIE ) +#define __ssi_select_ce() ( REG_SSI_CR0 &= ~SSI_CR0_FSEL ) + +#define __ssi_normal_mode() ( REG_SSI_ITR &= ~SSI_ITR_IVLTM_MASK ) + +#define __ssi_select_ce2() \ +do { \ + REG_SSI_CR0 |= SSI_CR0_FSEL; \ + REG_SSI_CR1 &= ~SSI_CR1_MULTS; \ +} while (0) + +#define __ssi_select_gpc() \ +do { \ + REG_SSI_CR0 &= ~SSI_CR0_FSEL; \ + REG_SSI_CR1 |= SSI_CR1_MULTS; \ +} while (0) + +#define __ssi_enable_tx_intr() \ + ( REG_SSI_CR0 |= SSI_CR0_TIE | SSI_CR0_TEIE ) + +#define __ssi_disable_tx_intr() \ + ( REG_SSI_CR0 &= ~(SSI_CR0_TIE | SSI_CR0_TEIE) ) + +#define __ssi_enable_rx_intr() \ + ( REG_SSI_CR0 |= SSI_CR0_RIE | SSI_CR0_REIE ) + +#define __ssi_disable_rx_intr() \ + ( REG_SSI_CR0 &= ~(SSI_CR0_RIE | SSI_CR0_REIE) ) + +#define __ssi_enable_loopback() ( REG_SSI_CR0 |= SSI_CR0_LOOP ) +#define __ssi_disable_loopback() ( REG_SSI_CR0 &= ~SSI_CR0_LOOP ) + +#define __ssi_enable_receive() ( REG_SSI_CR0 &= ~SSI_CR0_DISREV ) +#define __ssi_disable_receive() ( REG_SSI_CR0 |= SSI_CR0_DISREV ) + +#define __ssi_finish_receive() \ + ( REG_SSI_CR0 |= (SSI_CR0_RFINE | SSI_CR0_RFINC) ) + +#define __ssi_disable_recvfinish() \ + ( REG_SSI_CR0 &= ~(SSI_CR0_RFINE | SSI_CR0_RFINC) ) + +#define __ssi_flush_txfifo() ( REG_SSI_CR0 |= SSI_CR0_TFLUSH ) +#define __ssi_flush_rxfifo() ( REG_SSI_CR0 |= SSI_CR0_RFLUSH ) + +#define __ssi_flush_fifo() \ + ( REG_SSI_CR0 |= SSI_CR0_TFLUSH | SSI_CR0_RFLUSH ) + +#define __ssi_finish_transmit() ( REG_SSI_CR1 &= ~SSI_CR1_UNFIN ) + +#define __ssi_spi_format() \ +do { \ + REG_SSI_CR1 &= ~SSI_CR1_FMAT_MASK; \ + REG_SSI_CR1 |= SSI_CR1_FMAT_SPI; \ + REG_SSI_CR1 &= ~(SSI_CR1_TFVCK_MASK|SSI_CR1_TCKFI_MASK);\ + REG_SSI_CR1 |= (SSI_CR1_TFVCK_1 | SSI_CR1_TCKFI_1); \ +} while (0) + +/* TI's SSP format, must clear SSI_CR1.UNFIN */ +#define __ssi_ssp_format() \ +do { \ + REG_SSI_CR1 &= ~(SSI_CR1_FMAT_MASK | SSI_CR1_UNFIN); \ + REG_SSI_CR1 |= SSI_CR1_FMAT_SSP; \ +} while (0) + +/* National's Microwire format, must clear SSI_CR0.RFINE, and set max delay */ +#define __ssi_microwire_format() \ +do { \ + REG_SSI_CR1 &= ~SSI_CR1_FMAT_MASK; \ + REG_SSI_CR1 |= SSI_CR1_FMAT_MW1; \ + REG_SSI_CR1 &= ~(SSI_CR1_TFVCK_MASK|SSI_CR1_TCKFI_MASK);\ + REG_SSI_CR1 |= (SSI_CR1_TFVCK_3 | SSI_CR1_TCKFI_3); \ + REG_SSI_CR0 &= ~SSI_CR0_RFINE; \ +} while (0) + +/* CE# level (FRMHL), CE# in interval time (ITFRM), + clock phase and polarity (PHA POL), + interval time (SSIITR), interval characters/frame (SSIICR) */ + + /* frmhl,endian,mcom,flen,pha,pol MASK */ +#define SSICR1_MISC_MASK \ + ( SSI_CR1_FRMHL_MASK | SSI_CR1_LFST | SSI_CR1_MCOM_MASK \ + | SSI_CR1_FLEN_MASK | SSI_CR1_PHA | SSI_CR1_POL ) \ + +#define __ssi_spi_set_misc(frmhl,endian,flen,mcom,pha,pol) \ +do { \ + REG_SSI_CR1 &= ~SSICR1_MISC_MASK; \ + REG_SSI_CR1 |= ((frmhl) << 30) | ((endian) << 25) | \ + (((mcom) - 1) << 12) | (((flen) - 2) << 4) | \ + ((pha) << 1) | (pol); \ +} while(0) + +/* Transfer with MSB or LSB first */ +#define __ssi_set_msb() ( REG_SSI_CR1 &= ~SSI_CR1_LFST ) +#define __ssi_set_lsb() ( REG_SSI_CR1 |= SSI_CR1_LFST ) + +#define __ssi_set_frame_length(n) \ + REG_SSI_CR1 = (REG_SSI_CR1 & ~SSI_CR1_FLEN_MASK) | (((n) - 2) << 4) + +/* n = 1 - 16 */ +#define __ssi_set_microwire_command_length(n) \ + ( REG_SSI_CR1 = ((REG_SSI_CR1 & ~SSI_CR1_MCOM_MASK) | SSI_CR1_MCOM_##n##BIT) ) + +/* Set the clock phase for SPI */ +#define __ssi_set_spi_clock_phase(n) \ + ( REG_SSI_CR1 = ((REG_SSI_CR1 & ~SSI_CR1_PHA) | (n&0x1)) ) + +/* Set the clock polarity for SPI */ +#define __ssi_set_spi_clock_polarity(n) \ + ( REG_SSI_CR1 = ((REG_SSI_CR1 & ~SSI_CR1_POL) | (n&0x1)) ) + +/* n = ix8 */ +#define __ssi_set_tx_trigger(n) \ +do { \ + REG_SSI_CR1 &= ~SSI_CR1_TTRG_MASK; \ + REG_SSI_CR1 |= SSI_CR1_TTRG_##n; \ +} while (0) + +/* n = ix8 */ +#define __ssi_set_rx_trigger(n) \ +do { \ + REG_SSI_CR1 &= ~SSI_CR1_RTRG_MASK; \ + REG_SSI_CR1 |= SSI_CR1_RTRG_##n; \ +} while (0) + +#define __ssi_get_txfifo_count() \ + ( (REG_SSI_SR & SSI_SR_TFIFONUM_MASK) >> SSI_SR_TFIFONUM_BIT ) + +#define __ssi_get_rxfifo_count() \ + ( (REG_SSI_SR & SSI_SR_RFIFONUM_MASK) >> SSI_SR_RFIFONUM_BIT ) + +#define __ssi_clear_errors() \ + ( REG_SSI_SR &= ~(SSI_SR_UNDR | SSI_SR_OVER) ) + +#define __ssi_transfer_end() ( REG_SSI_SR & SSI_SR_END ) +#define __ssi_is_busy() ( REG_SSI_SR & SSI_SR_BUSY ) + +#define __ssi_txfifo_full() ( REG_SSI_SR & SSI_SR_TFF ) +#define __ssi_rxfifo_empty() ( REG_SSI_SR & SSI_SR_RFE ) +#define __ssi_rxfifo_noempty() ( REG_SSI_SR & SSI_SR_RFHF ) + +#define __ssi_set_clk(dev_clk, ssi_clk) \ + ( REG_SSI_GR = (dev_clk) / (2*(ssi_clk)) - 1 ) + +#define __ssi_receive_data() REG_SSI_DR +#define __ssi_transmit_data(v) ( REG_SSI_DR = (v) ) + + +/*************************************************************************** + * CIM + ***************************************************************************/ + +#define __cim_enable() ( REG_CIM_CTRL |= CIM_CTRL_ENA ) +#define __cim_disable() ( REG_CIM_CTRL &= ~CIM_CTRL_ENA ) + +#define __cim_input_data_inverse() ( REG_CIM_CFG |= CIM_CFG_INV_DAT ) +#define __cim_input_data_normal() ( REG_CIM_CFG &= ~CIM_CFG_INV_DAT ) + +#define __cim_vsync_active_low() ( REG_CIM_CFG |= CIM_CFG_VSP ) +#define __cim_vsync_active_high() ( REG_CIM_CFG &= ~CIM_CFG_VSP ) + +#define __cim_hsync_active_low() ( REG_CIM_CFG |= CIM_CFG_HSP ) +#define __cim_hsync_active_high() ( REG_CIM_CFG &= ~CIM_CFG_HSP ) + +#define __cim_sample_data_at_pclk_falling_edge() \ + ( REG_CIM_CFG |= CIM_CFG_PCP ) +#define __cim_sample_data_at_pclk_rising_edge() \ + ( REG_CIM_CFG &= ~CIM_CFG_PCP ) + +#define __cim_enable_dummy_zero() ( REG_CIM_CFG |= CIM_CFG_DUMMY_ZERO ) +#define __cim_disable_dummy_zero() ( REG_CIM_CFG &= ~CIM_CFG_DUMMY_ZERO ) + +#define __cim_select_external_vsync() ( REG_CIM_CFG |= CIM_CFG_EXT_VSYNC ) +#define __cim_select_internal_vsync() ( REG_CIM_CFG &= ~CIM_CFG_EXT_VSYNC ) + +/* n=0-7 */ +#define __cim_set_data_packing_mode(n) \ +do { \ + REG_CIM_CFG &= ~CIM_CFG_PACK_MASK; \ + REG_CIM_CFG |= (CIM_CFG_PACK_##n); \ +} while (0) + +#define __cim_enable_ccir656_progressive_mode() \ +do { \ + REG_CIM_CFG &= ~CIM_CFG_DSM_MASK; \ + REG_CIM_CFG |= CIM_CFG_DSM_CPM; \ +} while (0) + +#define __cim_enable_ccir656_interlace_mode() \ +do { \ + REG_CIM_CFG &= ~CIM_CFG_DSM_MASK; \ + REG_CIM_CFG |= CIM_CFG_DSM_CIM; \ +} while (0) + +#define __cim_enable_gated_clock_mode() \ +do { \ + REG_CIM_CFG &= ~CIM_CFG_DSM_MASK; \ + REG_CIM_CFG |= CIM_CFG_DSM_GCM; \ +} while (0) + +#define __cim_enable_nongated_clock_mode() \ +do { \ + REG_CIM_CFG &= ~CIM_CFG_DSM_MASK; \ + REG_CIM_CFG |= CIM_CFG_DSM_NGCM; \ +} while (0) + +/* sclk:system bus clock + * mclk: CIM master clock + */ +#define __cim_set_master_clk(sclk, mclk) \ +do { \ + REG_CIM_CTRL &= ~CIM_CTRL_MCLKDIV_MASK; \ + REG_CIM_CTRL |= (((sclk)/(mclk) - 1) << CIM_CTRL_MCLKDIV_BIT); \ +} while (0) + +#define __cim_enable_sof_intr() \ + ( REG_CIM_CTRL |= CIM_CTRL_DMA_SOFM ) +#define __cim_disable_sof_intr() \ + ( REG_CIM_CTRL &= ~CIM_CTRL_DMA_SOFM ) + +#define __cim_enable_eof_intr() \ + ( REG_CIM_CTRL |= CIM_CTRL_DMA_EOFM ) +#define __cim_disable_eof_intr() \ + ( REG_CIM_CTRL &= ~CIM_CTRL_DMA_EOFM ) + +#define __cim_enable_stop_intr() \ + ( REG_CIM_CTRL |= CIM_CTRL_DMA_STOPM ) +#define __cim_disable_stop_intr() \ + ( REG_CIM_CTRL &= ~CIM_CTRL_DMA_STOPM ) + +#define __cim_enable_trig_intr() \ + ( REG_CIM_CTRL |= CIM_CTRL_RXF_TRIGM ) +#define __cim_disable_trig_intr() \ + ( REG_CIM_CTRL &= ~CIM_CTRL_RXF_TRIGM ) + +#define __cim_enable_rxfifo_overflow_intr() \ + ( REG_CIM_CTRL |= CIM_CTRL_RXF_OFM ) +#define __cim_disable_rxfifo_overflow_intr() \ + ( REG_CIM_CTRL &= ~CIM_CTRL_RXF_OFM ) + +/* n=1-16 */ +#define __cim_set_frame_rate(n) \ +do { \ + REG_CIM_CTRL &= ~CIM_CTRL_FRC_MASK; \ + REG_CIM_CTRL |= CIM_CTRL_FRC_##n; \ +} while (0) + +#define __cim_enable_dma() ( REG_CIM_CTRL |= CIM_CTRL_DMA_EN ) +#define __cim_disable_dma() ( REG_CIM_CTRL &= ~CIM_CTRL_DMA_EN ) + +#define __cim_reset_rxfifo() ( REG_CIM_CTRL |= CIM_CTRL_RXF_RST ) +#define __cim_unreset_rxfifo() ( REG_CIM_CTRL &= ~CIM_CTRL_RXF_RST ) + +/* n=4,8,12,16,20,24,28,32 */ +#define __cim_set_rxfifo_trigger(n) \ +do { \ + REG_CIM_CTRL &= ~CIM_CTRL_RXF_TRIG_MASK; \ + REG_CIM_CTRL |= CIM_CTRL_RXF_TRIG_##n; \ +} while (0) + +#define __cim_clear_state() ( REG_CIM_STATE = 0 ) + +#define __cim_disable_done() ( REG_CIM_STATE & CIM_STATE_VDD ) +#define __cim_rxfifo_empty() ( REG_CIM_STATE & CIM_STATE_RXF_EMPTY ) +#define __cim_rxfifo_reach_trigger() ( REG_CIM_STATE & CIM_STATE_RXF_TRIG ) +#define __cim_rxfifo_overflow() ( REG_CIM_STATE & CIM_STATE_RXF_OF ) +#define __cim_clear_rxfifo_overflow() ( REG_CIM_STATE &= ~CIM_STATE_RXF_OF ) +#define __cim_dma_stop() ( REG_CIM_STATE & CIM_STATE_DMA_STOP ) +#define __cim_dma_eof() ( REG_CIM_STATE & CIM_STATE_DMA_EOF ) +#define __cim_dma_sof() ( REG_CIM_STATE & CIM_STATE_DMA_SOF ) + +#define __cim_get_iid() ( REG_CIM_IID ) +#define __cim_get_image_data() ( REG_CIM_RXFIFO ) +#define __cim_get_dam_cmd() ( REG_CIM_CMD ) + +#define __cim_set_da(a) ( REG_CIM_DA = (a) ) + +/*************************************************************************** + * LCD + ***************************************************************************/ +#define __lcd_as_smart_lcd() ( REG_LCD_CFG |= (1<> LCD_VSYNC_VPS_BIT ) + +#define __lcd_vsync_get_vpe() \ + ( (REG_LCD_VSYNC & LCD_VSYNC_VPE_MASK) >> LCD_VSYNC_VPE_BIT ) +#define __lcd_vsync_set_vpe(n) \ +do { \ + REG_LCD_VSYNC &= ~LCD_VSYNC_VPE_MASK; \ + REG_LCD_VSYNC |= (n) << LCD_VSYNC_VPE_BIT; \ +} while (0) + +#define __lcd_hsync_get_hps() \ + ( (REG_LCD_HSYNC & LCD_HSYNC_HPS_MASK) >> LCD_HSYNC_HPS_BIT ) +#define __lcd_hsync_set_hps(n) \ +do { \ + REG_LCD_HSYNC &= ~LCD_HSYNC_HPS_MASK; \ + REG_LCD_HSYNC |= (n) << LCD_HSYNC_HPS_BIT; \ +} while (0) + +#define __lcd_hsync_get_hpe() \ + ( (REG_LCD_HSYNC & LCD_HSYNC_HPE_MASK) >> LCD_VSYNC_HPE_BIT ) +#define __lcd_hsync_set_hpe(n) \ +do { \ + REG_LCD_HSYNC &= ~LCD_HSYNC_HPE_MASK; \ + REG_LCD_HSYNC |= (n) << LCD_HSYNC_HPE_BIT; \ +} while (0) + +#define __lcd_vat_get_ht() \ + ( (REG_LCD_VAT & LCD_VAT_HT_MASK) >> LCD_VAT_HT_BIT ) +#define __lcd_vat_set_ht(n) \ +do { \ + REG_LCD_VAT &= ~LCD_VAT_HT_MASK; \ + REG_LCD_VAT |= (n) << LCD_VAT_HT_BIT; \ +} while (0) + +#define __lcd_vat_get_vt() \ + ( (REG_LCD_VAT & LCD_VAT_VT_MASK) >> LCD_VAT_VT_BIT ) +#define __lcd_vat_set_vt(n) \ +do { \ + REG_LCD_VAT &= ~LCD_VAT_VT_MASK; \ + REG_LCD_VAT |= (n) << LCD_VAT_VT_BIT; \ +} while (0) + +#define __lcd_dah_get_hds() \ + ( (REG_LCD_DAH & LCD_DAH_HDS_MASK) >> LCD_DAH_HDS_BIT ) +#define __lcd_dah_set_hds(n) \ +do { \ + REG_LCD_DAH &= ~LCD_DAH_HDS_MASK; \ + REG_LCD_DAH |= (n) << LCD_DAH_HDS_BIT; \ +} while (0) + +#define __lcd_dah_get_hde() \ + ( (REG_LCD_DAH & LCD_DAH_HDE_MASK) >> LCD_DAH_HDE_BIT ) +#define __lcd_dah_set_hde(n) \ +do { \ + REG_LCD_DAH &= ~LCD_DAH_HDE_MASK; \ + REG_LCD_DAH |= (n) << LCD_DAH_HDE_BIT; \ +} while (0) + +#define __lcd_dav_get_vds() \ + ( (REG_LCD_DAV & LCD_DAV_VDS_MASK) >> LCD_DAV_VDS_BIT ) +#define __lcd_dav_set_vds(n) \ +do { \ + REG_LCD_DAV &= ~LCD_DAV_VDS_MASK; \ + REG_LCD_DAV |= (n) << LCD_DAV_VDS_BIT; \ +} while (0) + +#define __lcd_dav_get_vde() \ + ( (REG_LCD_DAV & LCD_DAV_VDE_MASK) >> LCD_DAV_VDE_BIT ) +#define __lcd_dav_set_vde(n) \ +do { \ + REG_LCD_DAV &= ~LCD_DAV_VDE_MASK; \ + REG_LCD_DAV |= (n) << LCD_DAV_VDE_BIT; \ +} while (0) + +#define __lcd_cmd0_set_sofint() ( REG_LCD_CMD0 |= LCD_CMD_SOFINT ) +#define __lcd_cmd0_clr_sofint() ( REG_LCD_CMD0 &= ~LCD_CMD_SOFINT ) +#define __lcd_cmd1_set_sofint() ( REG_LCD_CMD1 |= LCD_CMD_SOFINT ) +#define __lcd_cmd1_clr_sofint() ( REG_LCD_CMD1 &= ~LCD_CMD_SOFINT ) + +#define __lcd_cmd0_set_eofint() ( REG_LCD_CMD0 |= LCD_CMD_EOFINT ) +#define __lcd_cmd0_clr_eofint() ( REG_LCD_CMD0 &= ~LCD_CMD_EOFINT ) +#define __lcd_cmd1_set_eofint() ( REG_LCD_CMD1 |= LCD_CMD_EOFINT ) +#define __lcd_cmd1_clr_eofint() ( REG_LCD_CMD1 &= ~LCD_CMD_EOFINT ) + +#define __lcd_cmd0_set_pal() ( REG_LCD_CMD0 |= LCD_CMD_PAL ) +#define __lcd_cmd0_clr_pal() ( REG_LCD_CMD0 &= ~LCD_CMD_PAL ) + +#define __lcd_cmd0_get_len() \ + ( (REG_LCD_CMD0 & LCD_CMD_LEN_MASK) >> LCD_CMD_LEN_BIT ) +#define __lcd_cmd1_get_len() \ + ( (REG_LCD_CMD1 & LCD_CMD_LEN_MASK) >> LCD_CMD_LEN_BIT ) + +/*************************************************************************** + * RTC ops + ***************************************************************************/ + +#define __rtc_write_ready() ( REG_RTC_RCR & RTC_RCR_WRDY ) +#define __rtc_enabled() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR |= RTC_RCR_RTCE ; \ +}while(0) \ + +#define __rtc_disabled() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_RTCE; \ +}while(0) +#define __rtc_enable_alarm() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR |= RTC_RCR_AE; \ +}while(0) + +#define __rtc_disable_alarm() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_AE; \ +}while(0) + +#define __rtc_enable_alarm_irq() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR |= RTC_RCR_AIE; \ +}while(0) + +#define __rtc_disable_alarm_irq() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_AIE; \ +}while(0) +#define __rtc_enable_Hz_irq() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR |= RTC_RCR_HZIE; \ +}while(0) + +#define __rtc_disable_Hz_irq() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_HZIE; \ +}while(0) +#define __rtc_get_1Hz_flag() \ +do{ \ + while(!__rtc_write_ready()); \ + ((REG_RTC_RCR >> RTC_RCR_HZ) & 0x1); \ +}while(0) +#define __rtc_clear_1Hz_flag() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_HZ; \ +}while(0) +#define __rtc_get_alarm_flag() \ +do{ \ + while(!__rtc_write_ready()); \ + ((REG_RTC_RCR >> RTC_RCR_AF) & 0x1); \ +while(0) + +///( (REG_RTC_RCR >> RTC_RCR_AF_BIT) & 0x1 ) + +#define __rtc_clear_alarm_flag() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RCR &= ~RTC_RCR_AF; \ +}while(0) +//do +#define __rtc_get_second() \ +({ \ + while(!__rtc_write_ready());\ + REG_RTC_RSR; \ +}) +//while(0) + +#define __rtc_set_second(v) \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RSR = v; \ + while(!__rtc_write_ready());\ +}while(0) + +#define __rtc_get_alarm_second() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RSAR; \ +}while(0) + + +#define __rtc_set_alarm_second(v) \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RSAR = v; \ +}while(0) + +#define __rtc_RGR_is_locked() \ +({ \ + while(!__rtc_write_ready()); \ + REG_RTC_RGR >> RTC_RGR_LOCK; \ +}) +#define __rtc_lock_RGR() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RGR |= RTC_RGR_LOCK; \ +}while(0) + +#define __rtc_unlock_RGR() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RGR &= ~RTC_RGR_LOCK; \ +}while(0) + +#define __rtc_get_adjc_val() \ +do{ \ + while(!__rtc_write_ready()); \ + ( (REG_RTC_RGR & RTC_RGR_ADJC_MASK) >> RTC_RGR_ADJC_BIT ); \ +}while(0) +#define __rtc_set_adjc_val(v) \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RGR = (REG_RTC_RGR & (~RTC_RGR_ADJC_MASK)) |(v << RTC_RGR_ADJC_BIT); \ +}while(0) + +#define __rtc_get_nc1Hz_val() \ + ( (REG_RTC_RGR & RTC_RGR_NC1HZ_MASK) >> RTC_RGR_NC1HZ_BIT ) + +#define __rtc_set_nc1Hz_val(v) \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_RGR = (REG_RTC_RGR & (~RTC_RGR_NC1HZ_MASK)) | (v << RTC_RGR_NC1HZ_BIT);\ +}while(0) +#define __rtc_power_down() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_HCR |= RTC_HCR_PD; \ +}while(0) + +#define __rtc_get_hwfcr_val() \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_HWFCR & RTC_HWFCR_MASK; \ +}while(0) +#define __rtc_set_hwfcr_val(v) \ +do{ \ + while(!__rtc_write_ready()); \ + REG_RTC_HWFCR = (v) & RTC_HWFCR_MASK; \ +}while(0) + +#define __rtc_get_hrcr_val() \ +do{ \ + while(!__rtc_write_ready()); \ + ( REG_RTC_HRCR & RTC_HRCR_MASK ); \ +}while(0) +#define __rtc_set_hrcr_val(v) \ +do{ \ + while(!__rtc_write_ready()); \ + ( REG_RTC_HRCR = (v) & RTC_HRCR_MASK ); \ +}while(0) + +#define __rtc_enable_alarm_wakeup() \ +do{ \ + while(!__rtc_write_ready()); \ + ( REG_RTC_HWCR |= RTC_HWCR_EALM ); \ +}while(0) + +#define __rtc_disable_alarm_wakeup() \ +do{ \ + while(!__rtc_write_ready()); \ + ( REG_RTC_HWCR &= ~RTC_HWCR_EALM ); \ +}while(0) + +#define __rtc_status_hib_reset_occur() \ +({ \ + (REG_RTC_HWRSR & RTC_HWRSR_HR); \ +}) +#define __rtc_status_ppr_reset_occur() \ +do{ \ + while(!__rtc_write_ready()); \ + ( (REG_RTC_HWRSR & RTC_HWRSR_PPR) & 0x1 ); \ +}while(0) +#define __rtc_status_wakeup_pin_waken_up() \ +do{ \ + while(!__rtc_write_ready()); \ + ( (REG_RTC_HWRSR >> RTC_HWRSR_PIN) & 0x1 ); \ +}while(0) +#define __rtc_status_alarm_waken_up() \ +do{ \ + while(!__rtc_write_ready()); \ + ( (REG_RTC_HWRSR >> RTC_HWRSR_ALM) & 0x1 ); \ +}while(0) +#define __rtc_clear_hib_stat_all() \ +do{ \ + while(!__rtc_write_ready()); \ + ( REG_RTC_HWRSR = 0 ); \ +}while(0) + +#define __rtc_get_scratch_pattern() \ +({ while(!__rtc_write_ready()); \ + (REG_RTC_HSPR);}) +#define __rtc_set_scratch_pattern(n) \ +do{ \ + while(!__rtc_write_ready()); \ + (REG_RTC_HSPR = n ); \ +}while(0) + + +#endif /* !__ASSEMBLY__ */ + + +#ifndef _IPU_H_ +#define _IPU_H_ + +// IPU_REG_BASE +#define IPU_P_BASE 0x13080000 +#define IPU_V_BASE 0xB3080000 +#define IPU__SIZE 0x00001000 + +struct ipu_module +{ + unsigned int reg_ctrl; // 0x0 + unsigned int reg_status; // 0x4 + unsigned int reg_d_fmt; // 0x8 + unsigned int reg_y_addr; // 0xc + unsigned int reg_u_addr; // 0x10 + unsigned int reg_v_addr; // 0x14 + unsigned int reg_in_fm_gs; // 0x18 + unsigned int reg_y_stride; // 0x1c + unsigned int reg_uv_stride; // 0x20 + unsigned int reg_out_addr; // 0x24 + unsigned int reg_out_gs; // 0x28 + unsigned int reg_out_stride; // 0x2c + unsigned int rsz_coef_index; // 0x30 + unsigned int reg_csc_c0_coef; // 0x34 + unsigned int reg_csc_c1_coef; // 0x38 + unsigned int reg_csc_c2_coef; // 0x3c + unsigned int reg_csc_c3_coef; // 0x40 + unsigned int reg_csc_c4_coef; // 0x44 + unsigned int hrsz_coef_lut[20]; // 0x48 + unsigned int vrsz_coef_lut[20]; // 0x98 +}; + +typedef struct +{ + unsigned int coef; + unsigned short int in_n; + unsigned short int out_n; +} rsz_lut; + +struct Ration2m +{ + float ratio; + int n, m; +}; + + +// Register offset +#define REG_CTRL 0x0 +#define REG_STATUS 0x4 +#define REG_D_FMT 0x8 +#define REG_Y_ADDR 0xc +#define REG_U_ADDR 0x10 +#define REG_V_ADDR 0x14 +#define REG_IN_FM_GS 0x18 +#define REG_Y_STRIDE 0x1c +#define REG_UV_STRIDE 0x20 +#define REG_OUT_ADDR 0x24 +#define REG_OUT_GS 0x28 +#define REG_OUT_STRIDE 0x2c +#define REG_RSZ_COEF_INDEX 0x30 +#define REG_CSC_C0_COEF 0x34 +#define REG_CSC_C1_COEF 0x38 +#define REG_CSC_C2_COEF 0x3c +#define REG_CSC_C3_COEF 0x40 +#define REG_CSC_C4_COEF 0x44 +#define HRSZ_LUT_BASE 0x48 +#define VRSZ_LUT_BASE 0x98 + +// REG_CTRL field define +#define IPU_EN (1 << 0) +#define RSZ_EN (1 << 1) +#define FM_IRQ_EN (1 << 2) +#define IPU_RESET (1 << 3) +#define H_UP_SCALE (1 << 8) +#define V_UP_SCALE (1 << 9) +#define H_SCALE_SHIFT (8) +#define V_SCALE_SHIFT (9) + +// REG_STATUS field define +#define OUT_END (1 << 0) + +// REG_D_FMT field define +#define INFMT_YUV420 (0 << 0) +#define INFMT_YUV422 (1 << 0) +#define INFMT_YUV444 (2 << 0) +#define INFMT_YUV411 (3 << 0) +#define INFMT_YCbCr420 (4 << 0) +#define INFMT_YCbCr422 (5 << 0) +#define INFMT_YCbCr444 (6 << 0) +#define INFMT_YCbCr411 (7 << 0) +#define INFMT_MASK (7) + +#define OUTFMT_RGB555 (0 << 16) +#define OUTFMT_RGB565 (1 << 16) +#define OUTFMT_RGB888 (2 << 16) +#define OUTFMT_MASK (3 << 16) + +// REG_IN_FM_GS field define +#define IN_FM_W(val) ((val) << 16) +#define IN_FM_H(val) ((val) << 0) + +// REG_IN_FM_GS field define +#define OUT_FM_W(val) ((val) << 16) +#define OUT_FM_H(val) ((val) << 0) + +// REG_UV_STRIDE field define +#define U_STRIDE(val) ((val) << 16) +#define V_STRIDE(val) ((val) << 0) + +#define VE_IDX_SFT 0 +#define HE_IDX_SFT 16 + +// RSZ_LUT_FIELD +#define OUT_N_SFT 0 +#define OUT_N_MSK 0x1 +#define IN_N_SFT 1 +#define IN_N_MSK 0x1 +#define W_COEF_SFT 2 +#define W_COEF_MSK 0xFF + +// function about REG_CTRL +#define IPU_STOP_IPU() \ + REG32(IPU_V_BASE + REG_CTRL) &= ~IPU_EN; + +#define IPU_RUN_IPU() \ + REG32(IPU_V_BASE + REG_CTRL) |= IPU_EN; + +#define IPU_RESET_IPU() \ + REG32(IPU_V_BASE + REG_CTRL) |= IPU_RESET; + +#define IPU_DISABLE_IRQ() \ + REG32(IPU_V_BASE + REG_CTRL) &= ~FM_IRQ_EN; + +#define IPU_ENABLE_IRQ() \ + REG32(IPU_V_BASE + REG_CTRL) |= FM_IRQ_EN; + +#define IPU_DISABLE_RSIZE() \ + REG32(IPU_V_BASE + REG_CTRL) &= ~RSZ_EN; + +#define IPU_ENABLE_RSIZE() \ + REG32(IPU_V_BASE + REG_CTRL) |= RSZ_EN; + +#define IPU_IS_ENABLED() \ + (REG32(IPU_V_BASE + REG_CTRL) & IPU_EN) + +// function about REG_STATUS +#define IPU_CLEAR_END_FLAG() \ + REG32(IPU_V_BASE + REG_STATUS) &= ~OUT_END; + +#define IPU_POLLING_END_FLAG() \ + (REG32(IPU_V_BASE + REG_STATUS) & OUT_END) + +#define IPU_SET_INFMT(fmt) \ + REG32(IPU_V_BASE + REG_D_FMT) = (REG32(IPU_V_BASE + REG_D_FMT) & ~INFMT_MASK) | (fmt); + +#define IPU_SET_OUTFMT(fmt) \ + REG32(IPU_V_BASE + REG_D_FMT) = (REG32(IPU_V_BASE + REG_D_FMT) & ~OUTFMT_MASK) | (fmt); + +#define IPU_SET_IN_FM(w, h) \ + REG32(IPU_V_BASE + REG_IN_FM_GS) = IN_FM_W(w) | IN_FM_H(h); + +#define IPU_SET_Y_STRIDE(stride) \ + REG32(IPU_V_BASE + REG_Y_STRIDE) = (stride); + +#define IPU_SET_UV_STRIDE(u, v) \ + REG32(IPU_V_BASE + REG_UV_STRIDE) = U_STRIDE(u) | V_STRIDE(v); + +#define IPU_SET_Y_ADDR(addr) \ + REG32(IPU_V_BASE + REG_Y_ADDR) = (addr); + +#define IPU_SET_U_ADDR(addr) \ + REG32(IPU_V_BASE + REG_U_ADDR) = (addr); + +#define IPU_SET_V_ADDR(addr) \ + REG32(IPU_V_BASE + REG_V_ADDR) = (addr); + +#define IPU_SET_OUT_ADDR(addr) \ + REG32(IPU_V_BASE + REG_OUT_ADDR) = (addr); + +#define IPU_SET_OUT_FM(w, h) \ + REG32(IPU_V_BASE + REG_OUT_GS) = OUT_FM_W(w) | OUT_FM_H(h); + +#define IPU_SET_OUT_STRIDE(stride) \ + REG32(IPU_V_BASE + REG_OUT_STRIDE) = (stride); + +#define IPU_SET_CSC_C0_COEF(coef) \ + REG32(IPU_V_BASE + REG_CSC_C0_COEF) = (coef); + +#define IPU_SET_CSC_C1_COEF(coef) \ + REG32(IPU_V_BASE + REG_CSC_C1_COEF) = (coef); + +#define IPU_SET_CSC_C2_COEF(coef) \ + REG32(IPU_V_BASE + REG_CSC_C2_COEF) = (coef); + +#define IPU_SET_CSC_C3_COEF(coef) \ + REG32(IPU_V_BASE + REG_CSC_C3_COEF) = (coef); + +#define IPU_SET_CSC_C4_COEF(coef) \ + REG32(IPU_V_BASE + REG_CSC_C4_COEF) = (coef); + +/* YCbCr */ +/* parameter + R = 1.164 * (Y - 16) + 1.596 * (cr - 128) {C0, C1} + G = 1.164 * (Y - 16) - 0.392 * (cb -128) - 0.813 * (cr - 128) {C0, C2, C3} + B = 1.164 * (Y - 16) + 2.017 * (cb - 128) {C0, C4} +*/ +#define YCBCR_CSC_C0 0x4A8 /* 1.164 * 1024 */ +#define YCBCR_CSC_C1 0x662 /* 1.596 * 1024 */ +#define YCBCR_CSC_C2 0x191 /* 0.392 * 1024 */ +#define YCBCR_CSC_C3 0x341 /* 0.813 * 1024 */ +#define YCBCR_CSC_C4 0x811 /* 2.017 * 1024 */ + + +/* YUV */ +/* parameter + R = 1 * (Y – 0) + 1.4026 * (V - 128) {C0, C1} + G = 1 * (Y – 0) – 0.3444 * (U - 128) – 0.7144 * (V - 128) {C0, C2, C3} + B = 1 * (Y – 0) + 1.7730 * (U - 128) {C0, C4} +*/ +#define YUV_CSC_C0 0x400 +#define YUV_CSC_C1 0x59C +#define YUV_CSC_C2 0x161 +#define YUV_CSC_C3 0x2DC +#define YUV_CSC_C4 0x718 + +#endif /* _IPU_H_ */ + +/* Rockbox USB defines */ +#define USB_NUM_ENDPOINTS 3 +#define USB_DEVBSS_ATTR IBSS_ATTR + +#endif /* __JZ4740_H__ */ diff --git a/src/link.cpp b/src/link.cpp new file mode 100644 index 0000000..fcebd37 --- /dev/null +++ b/src/link.cpp @@ -0,0 +1,124 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include "link.h" +#include "menu.h" +#include "selector.h" + +using namespace std; +using namespace fastdelegate; + +Link::Link(GMenu2X *gmenu2x) : Button(gmenu2x, true) { + this->gmenu2x = gmenu2x; + action = MakeDelegate(this, &Link::run); + edited = false; + iconPath = gmenu2x->sc.getSkinFilePath("icons/generic.png"); + iconX = 0; + padding = 0; +} + +void Link::run() {} + +void Link::paint() { + gmenu2x->sc[getIconPath()]->blit(gmenu2x->s, iconX, rect.y+padding, 32,32); + gmenu2x->s->write( gmenu2x->font, getTitle(), iconX+16, rect.y+gmenu2x->skinConfInt["linkHeight"]-padding, SFontHAlignCenter, SFontVAlignBottom ); +} + +bool Link::paintHover() { + if (gmenu2x->useSelectionPng) + gmenu2x->sc["imgs/selection.png"]->blit(gmenu2x->s,rect,SFontHAlignCenter,SFontVAlignMiddle); + else + gmenu2x->s->box(rect.x, rect.y, rect.w, rect.h, gmenu2x->skinConfColors["selectionBg"]); + return true; +} + +string Link::getTitle() { + return title; +} + +void Link::setTitle(string title) { + this->title = title; + edited = true; +} + +string Link::getDescription() { + return description; +} + +void Link::setDescription(string description) { + this->description = description; + edited = true; +} + +string Link::getIcon() { + return icon; +} + +void Link::setIcon(string icon) { + string skinpath = gmenu2x->getExePath()+"skins/"+gmenu2x->confStr["skin"]; + if (icon.substr(0,skinpath.length()) == skinpath) { + string tempIcon = icon.substr(skinpath.length(), icon.length()); + string::size_type pos = tempIcon.find("/"); + if (pos != string::npos) + icon = "skin:"+tempIcon.substr(pos+1,icon.length()); + } + + iconPath = strreplace(icon,"skin:",skinpath+"/"); + if (iconPath.empty() || !fileExists(iconPath)) { + iconPath = strreplace(icon,"skin:",gmenu2x->getExePath()+"skins/Default/"); + if (!fileExists(iconPath)) searchIcon(); + } + + this->icon = icon; + edited = true; +} + +string Link::searchIcon() { + iconPath = gmenu2x->sc.getSkinFilePath("icons/generic.png"); + return iconPath; +} + +string Link::getIconPath() { + if (iconPath.empty()) searchIcon(); + return iconPath; +} + +void Link::setIconPath(string icon) { + if (fileExists(icon)) + iconPath = icon; + else + iconPath = gmenu2x->sc.getSkinFilePath("icons/generic.png"); +} + +void Link::setSize(int w, int h) { + Button::setSize(w,h); + recalcCoordinates(); +} + +void Link::setPosition(int x, int y) { + Button::setPosition(x,y); + recalcCoordinates(); +} + +void Link::recalcCoordinates() { + iconX = rect.x+(rect.w-32)/2; + padding = (gmenu2x->skinConfInt["linkHeight"] - 32 - gmenu2x->font->getLineHeight()) / 3; +} diff --git a/src/link.h b/src/link.h new file mode 100644 index 0000000..5c0494f --- /dev/null +++ b/src/link.h @@ -0,0 +1,70 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef LINK_H +#define LINK_H + +#include +#include + +#include "button.h" + +using std::string; + +class GMenu2X; + +/** +Base class that represents a link on screen. + + @author Massimiliano Torromeo +*/ +class Link : public Button { +private: + uint iconX, padding; + +protected: + bool edited; + string title, description, icon, iconPath; + + void recalcCoordinates(); + +public: + Link(GMenu2X *gmenu2x); + virtual ~Link() {}; + + virtual void paint(); + virtual bool paintHover(); + + void setSize(int w, int h); + void setPosition(int x, int y); + + string getTitle(); + void setTitle(string title); + string getDescription(); + void setDescription(string description); + string getIcon(); + void setIcon(string icon); + virtual string searchIcon(); + string getIconPath(); + void setIconPath(string icon); + + virtual void run(); +}; + +#endif diff --git a/src/linkaction.cpp b/src/linkaction.cpp new file mode 100644 index 0000000..e9f8b4e --- /dev/null +++ b/src/linkaction.cpp @@ -0,0 +1,34 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include "linkaction.h" + +using namespace std; + +LinkAction::LinkAction(GMenu2X *gmenu2x, LinkRunAction act) + : Link(gmenu2x) { + this->gmenu2x = gmenu2x; + this->action = act; +} + +void LinkAction::run() { + this->action(); +} diff --git a/src/linkaction.h b/src/linkaction.h new file mode 100644 index 0000000..6c39fc2 --- /dev/null +++ b/src/linkaction.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef LINKACTION_H +#define LINKACTION_H + +#include +#include + +#include "FastDelegate.h" +#include "link.h" + +using std::string; +using fastdelegate::FastDelegate0; + +typedef FastDelegate0<> LinkRunAction; + +class GMenu2X; + +/** +Executes an action when launched. + + @author Massimiliano Torromeo +*/ +class LinkAction : public Link { +private: + LinkRunAction action; +public: + LinkAction(GMenu2X *gmenu2x, LinkRunAction act); + virtual ~LinkAction() {}; + virtual void run(); +}; + +#endif diff --git a/src/linkapp.cpp b/src/linkapp.cpp new file mode 100644 index 0000000..88d27e1 --- /dev/null +++ b/src/linkapp.cpp @@ -0,0 +1,574 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include + +#include +#include +#include "linkapp.h" +#include "menu.h" +#include "selector.h" +#include "textmanualdialog.h" + +using namespace std; + +LinkApp::LinkApp(GMenu2X *gmenu2x, const char* linkfile) + : Link(gmenu2x) { + this->gmenu2x = gmenu2x; + manual = ""; + file = linkfile; + wrapper = false; + dontleave = false; + setClock(336); + setVolume(-1); + //G + //setGamma(0); + setBacklight(100); + selectordir = ""; + selectorfilter = ""; + icon = iconPath = ""; + selectorbrowser = false; + useRamTimings = false; + + string line; + ifstream infile (linkfile, ios_base::in); + while (getline(infile, line, '\n')) { + line = trim(line); + if (line=="") continue; + if (line[0]=='#') continue; + + string::size_type position = line.find("="); + string name = trim(line.substr(0,position)); + string value = trim(line.substr(position+1)); + if (name == "title") { + title = value; + } else if (name == "description") { + description = value; + } else if (name == "icon") { + setIcon(value); + } else if (name == "exec") { + exec = value; + } else if (name == "params") { + params = value; + } else if (name == "workdir") { + workdir = value; + } else if (name == "manual") { + manual = value; + } else if (name == "wrapper") { + if (value=="true") wrapper = true; + } else if (name == "dontleave") { + if (value=="true") dontleave = true; + } else if (name == "clock") { + setClock( atoi(value.c_str()) ); + //G + } else if (name == "gamma") { + setGamma( atoi(value.c_str()) ); + } else if (name == "backlight") { + setBacklight( atoi(value.c_str()) ); + } else if (name == "volume") { + setVolume( atoi(value.c_str()) ); + } else if (name == "selectordir") { + setSelectorDir( value ); + } else if (name == "selectorbrowser") { + if (value=="true") selectorbrowser = true; + } else if (name == "useramtimings") { + if (value=="true") useRamTimings = true; + } else if (name == "selectorfilter") { + setSelectorFilter( value ); + } else if (name == "selectorscreens") { + setSelectorScreens( value ); + } else if (name == "selectoraliases") { + setAliasFile( value ); + } else { + cout << "Unrecognized option: " << name << endl; + break; + } + } + infile.close(); + + if (iconPath.empty()) searchIcon(); + + edited = false; +} + +string LinkApp::searchIcon() { + string execicon = exec; + string::size_type pos = exec.rfind("."); + if (pos != string::npos) execicon = exec.substr(0,pos); + execicon += ".png"; + string exectitle = execicon; + pos = execicon.rfind("/"); + if (pos != string::npos) + string exectitle = execicon.substr(pos+1,execicon.length()); + + if (!gmenu2x->sc.getSkinFilePath("icons/"+exectitle).empty()) + iconPath = gmenu2x->sc.getSkinFilePath("icons/"+exectitle); + else if (fileExists(execicon)) + iconPath = execicon; + else + iconPath = gmenu2x->sc.getSkinFilePath("icons/generic.png"); + + return iconPath; +} + +int LinkApp::clock() { + return iclock; +} + +string LinkApp::clockStr(int maxClock) { + if (iclock>maxClock) setClock(maxClock); + return sclock; +} + +void LinkApp::setClock(int mhz) { + iclock = constrain(mhz,200,430); + stringstream ss; + sclock = ""; + ss << iclock << "Mhz"; + ss >> sclock; + + edited = true; +} + +int LinkApp::volume() { + return ivolume; +} + +string LinkApp::volumeStr() { + return svolume; +} + +void LinkApp::setVolume(int vol) { + ivolume = constrain(vol,-1,100); + stringstream ss; + svolume = ""; + if (ivolume<0) + ss << gmenu2x->confInt["globalVolume"]; + else + ss << ivolume; + ss >> svolume; + + edited = true; +} + +int LinkApp::backlight() +{ + return ibacklight; +} + +string LinkApp::backlightStr() +{ + return sbacklight; +} + +void LinkApp::setBacklight(int val) +{ + ibacklight = constrain(val,5,100); + stringstream ss; + sbacklight = ""; + ss << ibacklight; + ss >> sbacklight; + + edited = true; +} +//G +int LinkApp::gamma() { + return igamma; +} + +string LinkApp::gammaStr() { + return sgamma; +} + +void LinkApp::setGamma(int gamma) { + igamma = constrain(gamma,0,100); + stringstream ss; + sgamma = ""; + ss << igamma; + ss >> sgamma; + + edited = true; +} +// /G + +bool LinkApp::targetExists() { +#ifndef TARGET_GP2X + return true; //For displaying elements during testing on pc +#endif + + string target = exec; + if (!exec.empty() && exec[0]!='/' && !workdir.empty()) + target = workdir + "/" + exec; + + return fileExists(target); +} + +bool LinkApp::save() { + if (!edited) return false; + + ofstream f(file.c_str()); + if (f.is_open()) { + if (title!="" ) f << "title=" << title << endl; + if (description!="" ) f << "description=" << description << endl; + if (icon!="" ) f << "icon=" << icon << endl; + if (exec!="" ) f << "exec=" << exec << endl; + if (params!="" ) f << "params=" << params << endl; + if (workdir!="" ) f << "workdir=" << workdir << endl; + if (manual!="" ) f << "manual=" << manual << endl; + if (iclock!=0 ) f << "clock=" << iclock << endl; + if (useRamTimings ) f << "useramtimings=true" << endl; + if (ivolume>0 ) f << "volume=" << ivolume << endl; + //G + if (igamma!=0 ) f << "gamma=" << igamma << endl; + if (ibacklight!=0 ) f << "backlight=" << ibacklight << endl; + if (selectordir!="" ) f << "selectordir=" << selectordir << endl; + if (selectorbrowser ) f << "selectorbrowser=true" << endl; + if (selectorfilter!="" ) f << "selectorfilter=" << selectorfilter << endl; + if (selectorscreens!="") f << "selectorscreens=" << selectorscreens << endl; + if (aliasfile!="" ) f << "selectoraliases=" << aliasfile << endl; + if (wrapper ) f << "wrapper=true" << endl; + if (dontleave ) f << "dontleave=true" << endl; + f.close(); + sync(); + return true; + } else + cout << "\033[0;34mGMENU2X:\033[0;31m Error while opening the file '" << file << "' for write\033[0m" << endl; + return false; +} + +void LinkApp::drawRun() { + //Darkened background + gmenu2x->s->box(0, 0, gmenu2x->resX, gmenu2x->resY, 0,0,0,150); + + string text = gmenu2x->tr.translate("Launching $1",getTitle().c_str(),NULL); + int textW = gmenu2x->font->getTextWidth(text); + int boxW = 62+textW; + int halfBoxW = boxW/2; + + //outer box + gmenu2x->s->box(gmenu2x->halfX-2-halfBoxW, gmenu2x->halfY-23, halfBoxW*2+5, 47, gmenu2x->skinConfColors["messageBoxBg"]); + //inner rectangle + gmenu2x->s->rectangle(gmenu2x->halfX-halfBoxW, gmenu2x->halfY-21, boxW, 42, gmenu2x->skinConfColors["messageBoxBorder"]); + + int x = gmenu2x->halfX+10-halfBoxW; + /*if (getIcon()!="") + gmenu2x->sc[getIcon()]->blit(gmenu2x->s,x,104); + else + gmenu2x->sc["icons/generic.png"]->blit(gmenu2x->s,x,104);*/ + gmenu2x->sc[getIconPath()]->blit(gmenu2x->s,x,gmenu2x->halfY-16); + gmenu2x->s->write( gmenu2x->font, text, x+42, gmenu2x->halfY+1, SFontHAlignLeft, SFontVAlignMiddle ); + gmenu2x->s->flip(); +} + +void LinkApp::run() { + if (selectordir!="") + selector(); + else + launch(); +} + +void LinkApp::showManual() { + if (manual=="" || !fileExists(manual)) return; + + // Png manuals + string ext8 = manual.substr(manual.size()-8,8); + if (ext8==".man.png" || ext8==".man.bmp" || ext8==".man.jpg" || manual.substr(manual.size()-9,9)==".man.jpeg") { + //Raise the clock to speed-up the loading of the manual + gmenu2x->setClock(336); + + Surface pngman(manual); + Surface bg(gmenu2x->confStr["wallpaper"],false); + stringstream ss; + string pageStatus; + + bool close = false, repaint = true; + int page=0, pagecount=pngman.raw->w/320; + + ss << pagecount; + string spagecount; + ss >> spagecount; + + //Lower the clock + gmenu2x->setClock(gmenu2x->confInt["menuClock"]); + + while (!close) { + if (repaint) { + bg.blit(gmenu2x->s, 0, 0); + pngman.blit(gmenu2x->s, -page*320, 0); + + gmenu2x->drawBottomBar(); + gmenu2x->drawButton(gmenu2x->s, "x", gmenu2x->tr["Exit"], + gmenu2x->drawButton(gmenu2x->s, "right", gmenu2x->tr["Change page"], + gmenu2x->drawButton(gmenu2x->s, "left", "", 5)-10)); + + ss.clear(); + ss << page+1; + ss >> pageStatus; + pageStatus = gmenu2x->tr["Page"]+": "+pageStatus+"/"+spagecount; + gmenu2x->s->write(gmenu2x->font, pageStatus, 310, 230, SFontHAlignRight, SFontVAlignMiddle); + + gmenu2x->s->flip(); + repaint = false; + } + + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_Y] || gmenu2x->input[ACTION_X] || gmenu2x->input[ACTION_START] ) close = true; + if ( gmenu2x->input[ACTION_LEFT] && page>0 ) { page--; repaint=true; } + if ( gmenu2x->input[ACTION_RIGHT] && page txtman; + + string line; + ifstream infile(manual.c_str(), ios_base::in); + if (infile.is_open()) { + gmenu2x->setClock(336); + while (getline(infile, line, '\n')) txtman.push_back(line); + infile.close(); + + TextManualDialog tmd(gmenu2x, getTitle(), getIconPath(), &txtman); + gmenu2x->setClock(gmenu2x->confInt["menuClock"]); + tmd.exec(); + } + + return; + } + + //Readmes + vector readme; + + string line; + ifstream infile(manual.c_str(), ios_base::in); + if (infile.is_open()) { + gmenu2x->setClock(336); + while (getline(infile, line, '\n')) readme.push_back(line); + infile.close(); + + TextDialog td(gmenu2x, getTitle(), "ReadMe", getIconPath(), &readme); + gmenu2x->setClock(gmenu2x->confInt["menuClock"]); + td.exec(); + } +} + +void LinkApp::selector(int startSelection, string selectorDir) { + //Run selector interface + Selector sel(gmenu2x, this, selectorDir); + int selection = sel.exec(startSelection); + if (selection!=-1) { + gmenu2x->writeTmp(selection,sel.dir); + launch(sel.file, sel.dir); + } +} + +void LinkApp::launch(string selectedFile, string selectedDir) { + drawRun(); + save(); +#ifndef TARGET_GP2X + //delay for testing + SDL_Delay(1000); +#endif + + //Set correct working directory + string wd = workdir; + if (wd=="") { + string::size_type pos = exec.rfind("/"); + if (pos!=string::npos) + wd = exec.substr(0,pos); + } + if (!wd.empty()) { + if (wd[0]!='/') wd = gmenu2x->getExePath() + wd; + chdir(wd.c_str()); + } + + //selectedFile + if (selectedFile!="") { + string selectedFileExtension; + string::size_type i = selectedFile.rfind("."); + if (i != string::npos) { + selectedFileExtension = selectedFile.substr(i,selectedFile.length()); + selectedFile = selectedFile.substr(0,i); + } + + if (selectedDir=="") + selectedDir = getSelectorDir(); + if (params=="") { + params = cmdclean(selectedDir+selectedFile+selectedFileExtension); + } else { + string origParams = params; + params = strreplace(params,"[selFullPath]",cmdclean(selectedDir+selectedFile+selectedFileExtension)); + params = strreplace(params,"[selPath]",cmdclean(selectedDir)); + params = strreplace(params,"[selFile]",cmdclean(selectedFile)); + params = strreplace(params,"[selExt]",cmdclean(selectedFileExtension)); + if (params == origParams) params += " " + cmdclean(selectedDir+selectedFile+selectedFileExtension); + } + } + + if (useRamTimings) + gmenu2x->applyRamTimings(); + if (volume()>=0) + gmenu2x->setVolume(volume()); + +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Executing '" << title << "' (" << exec << " " << params << ")" << endl; +#endif + + //check if we have to quit + string command = cmdclean(exec); + + // Check to see if permissions are desirable + struct stat fstat; + if( stat( command.c_str(), &fstat ) == 0 ) { + struct stat newstat = fstat; + if( S_IRUSR != ( fstat.st_mode & S_IRUSR ) ) + newstat.st_mode |= S_IRUSR; + if( S_IXUSR != ( fstat.st_mode & S_IXUSR ) ) + newstat.st_mode |= S_IXUSR; + if( fstat.st_mode != newstat.st_mode ) + chmod( command.c_str(), newstat.st_mode ); + } // else, well.. we are no worse off :) + + if (params!="") command += " " + params; + if (gmenu2x->confInt["outputLogs"]) command += " &> " + cmdclean(gmenu2x->getExePath()) + "/log.txt"; + if (wrapper) command += "; sync & cd "+cmdclean(gmenu2x->getExePath())+"; exec ./gmenu2x"; + if (dontleave) { + system(command.c_str()); + } else { + if (gmenu2x->confInt["saveSelection"] && (gmenu2x->confInt["section"]!=gmenu2x->menu->selSectionIndex() || gmenu2x->confInt["link"]!=gmenu2x->menu->selLinkIndex())) + gmenu2x->writeConfig(); + if (gmenu2x->fwType == "open2x" && gmenu2x->savedVolumeMode != gmenu2x->volumeMode) + gmenu2x->writeConfigOpen2x(); + if (selectedFile=="") + gmenu2x->writeTmp(); + gmenu2x->quit(); + if (clock()!=gmenu2x->confInt["menuClock"]) + gmenu2x->setClock(clock()); + //if (gamma()!=0 && gamma()!=gmenu2x->confInt["gamma"]) + // gmenu2x->setGamma(gamma()); + if((backlight() != 0) && (backlight() != gmenu2x->confInt["backlight"])) + gmenu2x->setBacklight(backlight()); + + execlp("/bin/sh","/bin/sh","-c",command.c_str(),NULL); + //if execution continues then something went wrong and as we already called SDL_Quit we cannot continue + //try relaunching gmenu2x + chdir(gmenu2x->getExePath().c_str()); + execlp("./gmenu2x", "./gmenu2x", NULL); + } + + + chdir(gmenu2x->getExePath().c_str()); +} + +string LinkApp::getExec() { + return exec; +} + +void LinkApp::setExec(string exec) { + this->exec = exec; + edited = true; +} + +string LinkApp::getParams() { + return params; +} + +void LinkApp::setParams(string params) { + this->params = params; + edited = true; +} + +string LinkApp::getWorkdir() { + return workdir; +} + +void LinkApp::setWorkdir(string workdir) { + this->workdir = workdir; + edited = true; +} + +string LinkApp::getManual() { + return manual; +} + +void LinkApp::setManual(string manual) { + this->manual = manual; + edited = true; +} + +string LinkApp::getSelectorDir() { + return selectordir; +} + +void LinkApp::setSelectorDir(string selectordir) { + if (selectordir!="" && selectordir[selectordir.length()-1]!='/') selectordir += "/"; + this->selectordir = selectordir; + edited = true; +} + +bool LinkApp::getSelectorBrowser() { + return selectorbrowser; +} + +void LinkApp::setSelectorBrowser(bool value) { + selectorbrowser = value; + edited = true; +} + +bool LinkApp::getUseRamTimings() { + return useRamTimings; +} + +void LinkApp::setUseRamTimings(bool value) { + useRamTimings = value; + edited = true; +} + +string LinkApp::getSelectorFilter() { + return selectorfilter; +} + +void LinkApp::setSelectorFilter(string selectorfilter) { + this->selectorfilter = selectorfilter; + edited = true; +} + +string LinkApp::getSelectorScreens() { + return selectorscreens; +} + +void LinkApp::setSelectorScreens(string selectorscreens) { + this->selectorscreens = selectorscreens; + edited = true; +} + +string LinkApp::getAliasFile() { + return aliasfile; +} + +void LinkApp::setAliasFile(string aliasfile) { + if (fileExists(aliasfile)) { + this->aliasfile = aliasfile; + edited = true; + } +} diff --git a/src/linkapp.h b/src/linkapp.h new file mode 100644 index 0000000..37a0b1d --- /dev/null +++ b/src/linkapp.h @@ -0,0 +1,109 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef LINKAPP_H +#define LINKAPP_H + +#include +#include + +#include "link.h" + +using std::string; + +class GMenu2X; + +/** +Parses links files. + + @author Massimiliano Torromeo +*/ +class LinkApp : public Link { +private: + string sclock, svolume; + int iclock, ivolume; + //G + string sgamma; + string sbacklight; + //G + int igamma; + int ibacklight; + string exec, params, workdir, manual, selectordir, selectorfilter, selectorscreens; + bool selectorbrowser, useRamTimings; + void drawRun(); + + string aliasfile; + +public: + LinkApp(GMenu2X *gmenu2x, const char* linkfile); + virtual string searchIcon(); + + string getExec(); + void setExec(string exec); + string getParams(); + void setParams(string params); + string getWorkdir(); + void setWorkdir(string workdir); + string getManual(); + void setManual(string manual); + string getSelectorDir(); + void setSelectorDir(string selectordir); + bool getSelectorBrowser(); + void setSelectorBrowser(bool value); + bool getUseRamTimings(); + void setUseRamTimings(bool value); + string getSelectorScreens(); + void setSelectorScreens(string selectorscreens); + string getSelectorFilter(); + void setSelectorFilter(string selectorfilter); + string getAliasFile(); + void setAliasFile(string aliasfile); + + string file; + + int clock(); + string clockStr(int maxClock); + void setClock(int mhz); + + int volume(); + string volumeStr(); + void setVolume(int vol); + +//G + int gamma(); + string gammaStr(); + void setGamma(int gamma); + + int backlight(); + string backlightStr(); + void setBacklight(int val); +// /G + + bool wrapper; + bool dontleave; + + bool save(); + void run(); + void showManual(); + void selector(int startSelection=0, string selectorDir=""); + void launch(string selectedFile="", string selectedDir=""); + bool targetExists(); +}; + +#endif diff --git a/src/listview.cpp b/src/listview.cpp new file mode 100644 index 0000000..a295ca9 --- /dev/null +++ b/src/listview.cpp @@ -0,0 +1,78 @@ +#include "listview.h" + +ListView::ListView(GMenu2X *gmenu2x) { + this->gmenu2x = gmenu2x; + firstDisplayItem = selectedItem = 0; + itemsPerPage = 11; +} + +ListView::~ ListView() {} + +ListViewItem * ListView::add(ListViewItem *item) { + items.push_back(item); + return item; +} + +ListViewItem * ListView::add(string text) { + ListViewItem *item = new ListViewItem(this,text); + return add(item); +} + +void ListView::del(ListViewItem * item) { + vector::iterator p = find(items.begin(), items.end(), item); + if (p != items.end()) + items.erase(p); +} + +void ListView::del(int itemIndex) { + items.erase(items.begin()+itemIndex); +} + +void ListView::clear() { + items.clear(); +} + +ListViewItem * ListView::operator [](int index) { + return items[index]; +} + +void ListView::setPosition(int x, int y) { + rect.x = x; + rect.y = y; +} + +void ListView::setSize(int w, int h) { + rect.w = w; + rect.h = h; +} + +void ListView::paint() { + gmenu2x->s->setClipRect(rect); + + //Selection + int iY = selectedItem-firstDisplayItem; + iY = rect.y+(iY*16); + if (selectedItem<(int)items.size()) + gmenu2x->s->box(1, iY, 309, 14, gmenu2x->skinConfColors["selectionBg"]); + + //Items + iY = rect.y; + for (int i=firstDisplayItem; i<(int)items.size() && isetPosition(4,iY); + items[i]->paint(); + iY += items[i]->getHeight(); + } + + gmenu2x->drawScrollBar(itemsPerPage, items.size(), firstDisplayItem, 42,175); + + gmenu2x->s->clearClipRect(); +} + +void ListView::handleInput() { + for (int i=firstDisplayItem; i<(int)items.size() && ihandleTS(); +} + +int ListView::getWidth() { + return rect.w; +} diff --git a/src/listview.h b/src/listview.h new file mode 100644 index 0000000..e8dd6e1 --- /dev/null +++ b/src/listview.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef LISTVIEW_H_ +#define LISTVIEW_H_ + +#include "gmenu2x.h" +#include "listviewitem.h" + +using std::vector; + +class ListView { +private: + int firstDisplayItem, selectedItem; + int itemsPerPage; + +protected: + vector items; + SDL_Rect rect; + +public: + ListView(GMenu2X *gmenu2x); + virtual ~ListView(); + + GMenu2X *gmenu2x; + + ListViewItem *add(ListViewItem *item); + ListViewItem *add(string text); + void del(ListViewItem *item); + void del(int itemIndex); + void clear(); + + void setPosition(int x, int y); + void setSize(int w, int h); + int getWidth(); + + virtual void paint(); + virtual void handleInput(); + + ListViewItem *operator[](int); +}; + +#endif diff --git a/src/listviewitem.cpp b/src/listviewitem.cpp new file mode 100644 index 0000000..59ed829 --- /dev/null +++ b/src/listviewitem.cpp @@ -0,0 +1,30 @@ +#include "listview.h" +#include "listviewitem.h" + +ListViewItem::ListViewItem(ListView * parent, string text) { + this->parent = parent; + rect.h = 16; + rect.w = parent->getWidth(); +} + +ListViewItem::~ ListViewItem() {} + +void ListViewItem::setPosition(int x, int y) { + rect.x = x; + rect.y = y; +} + +void ListViewItem::paint() { + parent->gmenu2x->s->write(parent->gmenu2x->font, text, rect.x, rect.y, SFontHAlignLeft, SFontVAlignMiddle); +} + +int ListViewItem::getHeight() { + return rect.h; +} + +void ListViewItem::handleTS() { + if (parent->gmenu2x->ts.inRect(rect)) + onClick(); +} + +void ListViewItem::onClick() {} diff --git a/src/listviewitem.h b/src/listviewitem.h new file mode 100644 index 0000000..7c03e08 --- /dev/null +++ b/src/listviewitem.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef LISTVIEWITEM_H_ +#define LISTVIEWITEM_H_ + +#include + +using std::string; + +class ListView; + +class ListViewItem { +protected: + ListView *parent; + SDL_Rect rect; + +public: + ListViewItem(ListView *parent, string text); + virtual ~ListViewItem(); + + string text; + + void setPosition(int x, int y); + int getHeight(); + + virtual void paint(); + virtual void handleTS(); + virtual void onClick(); +}; + +#endif diff --git a/src/lr.xcf b/src/lr.xcf new file mode 100644 index 0000000000000000000000000000000000000000..cd5c249c17bd775cdaed7f657433370d0349ff03 GIT binary patch literal 21447 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 +#include +#include +#include +#include +#include + +#include "gmenu2x.h" +#include "linkapp.h" +#include "menu.h" +#include "filelister.h" +#include "utilities.h" +#include "pxml.h" + +using namespace std; + +Menu::Menu(GMenu2X *gmenu2x) { + this->gmenu2x = gmenu2x; + iFirstDispSection = 0; + + DIR *dirp; + struct stat st; + struct dirent *dptr; + string filepath; + + if ((dirp = opendir("sections")) == NULL) return; + + while ((dptr = readdir(dirp))) { + if (dptr->d_name[0]=='.') continue; + filepath = (string)"sections/"+dptr->d_name; + int statRet = stat(filepath.c_str(), &st); + if (!S_ISDIR(st.st_mode)) continue; + if (statRet != -1) { + sections.push_back((string)dptr->d_name); + linklist ll; + links.push_back(ll); + } + } + + closedir(dirp); + sort(sections.begin(),sections.end(),case_less()); + setSectionIndex(0); + readLinks(); +} + +Menu::~Menu() { + freeLinks(); +} + +uint Menu::firstDispRow() { + return iFirstDispRow; +} + +void Menu::loadIcons() { + //reload section icons + for (uint i=0; isc.getSkinFilePath(sectionIcon).empty()) + gmenu2x->sc.add("skin:"+sectionIcon); + + //check link's icons + string linkIcon; + for (uint x=0; xsize(); x++) { + linkIcon = sectionLinks(i)->at(x)->getIcon(); + LinkApp *linkapp = dynamic_cast(sectionLinks(i)->at(x)); + + if (linkIcon.substr(0,5)=="skin:") { + linkIcon = gmenu2x->sc.getSkinFilePath(linkIcon.substr(5,linkIcon.length())); + if (linkapp != NULL && !fileExists(linkIcon)) + linkapp->searchIcon(); + else + sectionLinks(i)->at(x)->setIconPath(linkIcon); + + } else if (!fileExists(linkIcon)) { + if (linkapp != NULL) linkapp->searchIcon(); + } + } + } +} + +/*==================================== + SECTION MANAGEMENT + ====================================*/ +void Menu::freeLinks() { + for (vector::iterator section = links.begin(); sectionbegin(); linkend(); link++) + free(*link); +} + +linklist *Menu::sectionLinks(int i) { + if (i<0 || i>(int)links.size()) + i = selSectionIndex(); + + if (i<0 || i>(int)links.size()) + return NULL; + + return &links[i]; +} + +void Menu::decSectionIndex() { + setSectionIndex(iSection-1); +} + +void Menu::incSectionIndex() { + setSectionIndex(iSection+1); +} + +uint Menu::firstDispSection() { + return iFirstDispSection; +} + +int Menu::selSectionIndex() { + return iSection; +} + +string Menu::selSection() { + return sections[iSection]; +} + +void Menu::setSectionIndex(int i) { + if (i<0) + i=sections.size()-1; + else if (i>=(int)sections.size()) + i=0; + iSection = i; + + if (i>(int)iFirstDispSection+4) + iFirstDispSection = i-4; + else if (i<(int)iFirstDispSection) + iFirstDispSection = i; + + iLink = 0; + iFirstDispRow = 0; +} + +string Menu::sectionPath(int section) { + if (section<0 || section>(int)sections.size()) section = iSection; + return "sections/"+sections[section]+"/"; +} + +/*==================================== + LINKS MANAGEMENT + ====================================*/ +bool Menu::addActionLink(uint section, string title, LinkRunAction action, string description, string icon) { + if (section>=sections.size()) return false; + + LinkAction *linkact = new LinkAction(gmenu2x,action); + linkact->setSize(gmenu2x->skinConfInt["linkWidth"],gmenu2x->skinConfInt["linkHeight"]); + linkact->setTitle(title); + linkact->setDescription(description); + if (gmenu2x->sc.exists(icon) || (icon.substr(0,5)=="skin:" && !gmenu2x->sc.getSkinFilePath(icon.substr(5,icon.length())).empty()) || fileExists(icon)) + linkact->setIcon(icon); + + sectionLinks(section)->push_back(linkact); + return true; +} + +bool Menu::addLink(string path, string file, string section) { + if (section=="") + section = selSection(); + else if (find(sections.begin(),sections.end(),section)==sections.end()) { + //section directory doesn't exists + if (!addSection(section)) + return false; + } + if (path[path.length()-1]!='/') path += "/"; + + //if the extension is not equal to gpu or dge then enable the wrapepr by default + bool wrapper = false, pxml = false; + + //strip the extension from the filename + string title = file; + string::size_type pos = title.rfind("."); + if (pos!=string::npos && pos>0) { + string ext = title.substr(pos, title.length()); + transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int)) tolower); + if (ext == ".gpu" || ext == ".dge") wrapper = false; + else if (ext == ".pxml") pxml = true; + title = title.substr(0, pos); + } + + string linkpath = "sections/"+section+"/"+title; + int x=2; + while (fileExists(linkpath)) { + stringstream ss; + linkpath = ""; + ss << x; + ss >> linkpath; + linkpath = "sections/"+section+"/"+title+linkpath; + x++; + } +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Adding link: " << linkpath << endl; +#endif + + //search for a manual + pos = file.rfind("."); + string exename = path+file.substr(0,pos); + string manual = ""; + if (fileExists(exename+".man.png")) { + manual = exename+".man.png"; + } else if (fileExists(exename+".man.jpg")) { + manual = exename+".man.jpg"; + } else if (fileExists(exename+".man.jpeg")) { + manual = exename+".man.jpeg"; + } else if (fileExists(exename+".man.bmp")) { + manual = exename+".man.bmp"; + } else if (fileExists(exename+".man.txt")) { + manual = exename+".man.txt"; + } else { + //scan directory for a file like *readme* + FileLister fl(path, false); + fl.setFilter(".txt"); + fl.browse(); + bool found = false; + for (uint x=0; xfont->getTextWidth(shorttitle)>gmenu2x->skinConfInt["linkWidth"]) { + while (gmenu2x->font->getTextWidth(shorttitle+"..")>gmenu2x->skinConfInt["linkWidth"]) + shorttitle = shorttitle.substr(0,shorttitle.length()-1); + shorttitle += ".."; + } + + ofstream f(linkpath.c_str()); + if (f.is_open()) { + f << "title=" << shorttitle << endl; + f << "exec=" << exec << endl; + if (!description.empty()) f << "description=" << description << endl; + if (!icon.empty()) f << "icon=" << icon << endl; + if (!manual.empty()) f << "manual=" << manual << endl; + if (wrapper) f << "wrapper=true" << endl; + f.close(); + sync(); + int isection = find(sections.begin(),sections.end(),section) - sections.begin(); + if (isection>=0 && isection<(int)sections.size()) { +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Section: " << sections[isection] << "(" << isection << ")" << endl; +#endif + LinkApp* link = new LinkApp(gmenu2x, linkpath.c_str()); + link->setSize(gmenu2x->skinConfInt["linkWidth"],gmenu2x->skinConfInt["linkHeight"]); + links[isection].push_back( link ); + } + } else { +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0;31m Error while opening the file '" << linkpath << "' for write\033[0m" << endl; +#endif + return false; + } + + return true; +} + +bool Menu::addSection(string sectionName) { + string sectiondir = "sections/"+sectionName; + if (mkdir(sectiondir.c_str(),0777)==0) { + sections.push_back(sectionName); + linklist ll; + links.push_back(ll); + return true; + } + return false; +} + +void Menu::deleteSelectedLink() { +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Deleting link " << selLink()->getTitle() << endl; +#endif + if (selLinkApp()!=NULL) + unlink(selLinkApp()->file.c_str()); + gmenu2x->sc.del(selLink()->getIconPath()); + sectionLinks()->erase( sectionLinks()->begin() + selLinkIndex() ); + setLinkIndex(selLinkIndex()); +} + +void Menu::deleteSelectedSection() { +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Deleting section " << selSection() << endl; +#endif + gmenu2x->sc.del("sections/"+selSection()+".png"); + links.erase( links.begin()+selSectionIndex() ); + sections.erase( sections.begin()+selSectionIndex() ); + setSectionIndex(0); //reload sections +} + +bool Menu::linkChangeSection(uint linkIndex, uint oldSectionIndex, uint newSectionIndex) { + if (oldSectionIndexsize()) { + sectionLinks(newSectionIndex)->push_back( sectionLinks(oldSectionIndex)->at(linkIndex) ); + sectionLinks(oldSectionIndex)->erase( sectionLinks(oldSectionIndex)->begin()+linkIndex ); + //Select the same link in the new position + setSectionIndex(newSectionIndex); + setLinkIndex(sectionLinks(newSectionIndex)->size()-1); + return true; + } + return false; +} + +void Menu::linkLeft() { + if (iLink%gmenu2x->linkColumns == 0) + setLinkIndex( sectionLinks()->size()>iLink+gmenu2x->linkColumns-1 ? iLink+gmenu2x->linkColumns-1 : sectionLinks()->size()-1 ); + else + setLinkIndex(iLink-1); +} + +void Menu::linkRight() { + if (iLink%gmenu2x->linkColumns == (gmenu2x->linkColumns-1) || iLink == (int)sectionLinks()->size()-1) + setLinkIndex(iLink-iLink%gmenu2x->linkColumns); + else + setLinkIndex(iLink+1); +} + +void Menu::linkUp() { + int l = iLink-gmenu2x->linkColumns; + if (l<0) { + uint rows = (uint)ceil(sectionLinks()->size()/(double)gmenu2x->linkColumns); + l = (rows*gmenu2x->linkColumns)+l; + if (l >= (int)sectionLinks()->size()) + l -= gmenu2x->linkColumns; + } + setLinkIndex(l); +} + +void Menu::linkDown() { + uint l = iLink+gmenu2x->linkColumns; + if (l >= sectionLinks()->size()) { + uint rows = (uint)ceil(sectionLinks()->size()/(double)gmenu2x->linkColumns); + uint curCol = (uint)ceil((iLink+1)/(double)gmenu2x->linkColumns); + if (rows > curCol) + l = sectionLinks()->size()-1; + else + l %= gmenu2x->linkColumns; + } + setLinkIndex(l); +} + +int Menu::selLinkIndex() { + return iLink; +} + +Link *Menu::selLink() { + if (sectionLinks()->size()==0) return NULL; + return sectionLinks()->at(iLink); +} + +LinkApp *Menu::selLinkApp() { + return dynamic_cast(selLink()); +} + +void Menu::setLinkIndex(int i) { + if (i<0) + i=sectionLinks()->size()-1; + else if (i>=(int)sectionLinks()->size()) + i=0; + + if (i>=(int)(iFirstDispRow*gmenu2x->linkColumns+gmenu2x->linkColumns*gmenu2x->linkRows)) + iFirstDispRow = i/gmenu2x->linkColumns-gmenu2x->linkRows+1; + else if (i<(int)(iFirstDispRow*gmenu2x->linkColumns)) + iFirstDispRow = i/gmenu2x->linkColumns; + + iLink = i; +} + +void Menu::readLinks() { + vector linkfiles; + + iLink = 0; + iFirstDispRow = 0; + + DIR *dirp; + struct stat st; + struct dirent *dptr; + string filepath; + + for (uint i=0; id_name[0]=='.') continue; + filepath = sectionPath(i)+dptr->d_name; + int statRet = stat(filepath.c_str(), &st); + if (S_ISDIR(st.st_mode)) continue; + if (statRet != -1) { + linkfiles.push_back(filepath); + } + } + + sort(linkfiles.begin(), linkfiles.end(),case_less()); + for (uint x=0; xsetSize(gmenu2x->skinConfInt["linkWidth"],gmenu2x->skinConfInt["linkHeight"]); + if (link->targetExists()) + links[i].push_back( link ); + else + free(link); + } + + closedir(dirp); + } +} diff --git a/src/menu.h b/src/menu.h new file mode 100644 index 0000000..a832b41 --- /dev/null +++ b/src/menu.h @@ -0,0 +1,85 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENU_H +#define MENU_H + +#include +#include +#include "linkaction.h" + +using std::string; +using std::vector; + +class LinkApp; +class GMenu2X; + +typedef vector linklist; + +/** +Handles the menu structure + + @author Massimiliano Torromeo +*/ +class Menu { +private: + GMenu2X *gmenu2x; + int iSection, iLink; + uint iFirstDispSection, iFirstDispRow; + void readLinks(); + void freeLinks(); + +public: + Menu(GMenu2X *gmenu2x); + ~Menu(); + + vector sections; + vector links; + linklist *sectionLinks(int i = -1); + + int selSectionIndex(); + string selSection(); + void decSectionIndex(); + void incSectionIndex(); + void setSectionIndex(int i); + uint firstDispSection(); + uint firstDispRow(); + + bool addActionLink(uint section, string title, LinkRunAction action, string description="", string icon=""); + bool addLink(string path, string file, string section=""); + bool addSection(string sectionName); + void deleteSelectedLink(); + void deleteSelectedSection(); + + void loadIcons(); + bool linkChangeSection(uint linkIndex, uint oldSectionIndex, uint newSectionIndex); + + int selLinkIndex(); + Link *selLink(); + LinkApp *selLinkApp(); + void linkLeft(); + void linkRight(); + void linkUp(); + void linkDown(); + void setLinkIndex(int i); + + string sectionPath(int section = -1); +}; + +#endif diff --git a/src/menusetting.cpp b/src/menusetting.cpp new file mode 100644 index 0000000..4f5fc97 --- /dev/null +++ b/src/menusetting.cpp @@ -0,0 +1,36 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusetting.h" + +MenuSetting::MenuSetting(GMenu2X *gmenu2x, string name, string description) { + this->gmenu2x = gmenu2x; + this->name = name; + this->description = description; +} + +void MenuSetting::draw(int y) { + gmenu2x->s->write( gmenu2x->font, name, 5, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSetting::handleTS() {} +void MenuSetting::manageInput() {} +void MenuSetting::adjustInput() {} +void MenuSetting::drawSelected(int) {} +bool MenuSetting::edited() { return true; } diff --git a/src/menusetting.h b/src/menusetting.h new file mode 100644 index 0000000..6f83341 --- /dev/null +++ b/src/menusetting.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTING_H +#define MENUSETTING_H + +#ifdef TARGET_GP2X +#include "inputmanager.h" +#endif + +#include "gmenu2x.h" + +using std::string; + +/** +Base class for different kind of option + + @author Massimiliano Torromeo +*/ +class MenuSetting { +private: + GMenu2X *gmenu2x; + +public: + MenuSetting(GMenu2X *gmenu2x, string name, string description); + virtual ~MenuSetting() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + string name, description; +}; + +#endif diff --git a/src/menusettingbool.cpp b/src/menusettingbool.cpp new file mode 100644 index 0000000..4a4e54a --- /dev/null +++ b/src/menusettingbool.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingbool.h" +#include "utilities.h" +#include + +using namespace std; +using namespace fastdelegate; + +MenuSettingBool::MenuSettingBool(GMenu2X *gmenu2x, string name, string description, int *value) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + _ivalue = value; + _value = NULL; + originalValue = *value != 0; + setValue(this->value()); + + btnToggle = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Switch"]); + btnToggle->setAction(MakeDelegate(this, &MenuSettingBool::toggle)); +} + +MenuSettingBool::MenuSettingBool(GMenu2X *gmenu2x, string name, string description, bool *value) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + _value = value; + _ivalue = NULL; + originalValue = *value; + setValue(this->value()); + + btnToggle = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Switch"]); + btnToggle->setAction(MakeDelegate(this, &MenuSettingBool::toggle)); +} + +void MenuSettingBool::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, strvalue, 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingBool::handleTS() { + btnToggle->handleTS(); +} + +void MenuSettingBool::manageInput() { + if ( gmenu2x->input[ACTION_B] ) toggle(); +} + +void MenuSettingBool::toggle() { + setValue(!value()); +} + +void MenuSettingBool::setValue(int value) { + setValue(value != 0); +} + +void MenuSettingBool::setValue(bool value) { + if (_value == NULL) + *_ivalue = value; + else + *_value = value; + strvalue = value ? "ON" : "OFF"; +} + +bool MenuSettingBool::value() { + if (_value == NULL) + return *_ivalue != 0; + else + return *_value; +} + +void MenuSettingBool::adjustInput() {} + +void MenuSettingBool::drawSelected(int) { + gmenu2x->drawButton(btnToggle); +} + +bool MenuSettingBool::edited() { + return originalValue != value(); +} diff --git a/src/menusettingbool.h b/src/menusettingbool.h new file mode 100644 index 0000000..9373a7d --- /dev/null +++ b/src/menusettingbool.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGBOOL_H +#define MENUSETTINGBOOL_H + +#include "iconbutton.h" +#include "menusetting.h" + +using std::string; +class GMenu2X; + +class MenuSettingBool : public MenuSetting { +private: + bool originalValue; + bool *_value; + int *_ivalue; + string strvalue; + GMenu2X *gmenu2x; + IconButton *btnToggle; + + void toggle(); + +public: + MenuSettingBool(GMenu2X *gmenu2x, string name, string description, bool *value); + MenuSettingBool(GMenu2X *gmenu2x, string name, string description, int *value); + virtual ~MenuSettingBool() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + void setValue(int value); + void setValue(bool value); + bool value(); +}; + +#endif diff --git a/src/menusettingdir.cpp b/src/menusettingdir.cpp new file mode 100644 index 0000000..a98dc18 --- /dev/null +++ b/src/menusettingdir.cpp @@ -0,0 +1,81 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingdir.h" +#include "dirdialog.h" +#include "utilities.h" + +using namespace std; +using namespace fastdelegate; + +MenuSettingDir::MenuSettingDir(GMenu2X *gmenu2x, string name, string description, string *value) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + _value = value; + originalValue = *value; + + btnClear = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Clear"]); + btnClear->setAction(MakeDelegate(this, &MenuSettingDir::clear)); + + btnSelect = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Select a directory"]); + btnSelect->setAction(MakeDelegate(this, &MenuSettingDir::select)); +} + +void MenuSettingDir::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, value(), 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingDir::handleTS() { + btnSelect->handleTS(); + btnClear->handleTS(); +} + +void MenuSettingDir::manageInput() { + if ( gmenu2x->input[ACTION_X] ) setValue(""); + if ( gmenu2x->input[ACTION_B] ) select(); +} + +void MenuSettingDir::clear() { + setValue(""); +} + +void MenuSettingDir::select() { + DirDialog dd(gmenu2x, description, value()); + if (dd.exec()) setValue( dd.path ); +} + +void MenuSettingDir::setValue(string value) { + *_value = value; +} + +string MenuSettingDir::value() { + return *_value; +} + +void MenuSettingDir::adjustInput() {} + +void MenuSettingDir::drawSelected(int) { + gmenu2x->drawButton(btnClear, + gmenu2x->drawButton(btnSelect)); +} + +bool MenuSettingDir::edited() { + return originalValue != value(); +} diff --git a/src/menusettingdir.h b/src/menusettingdir.h new file mode 100644 index 0000000..e5c4c3a --- /dev/null +++ b/src/menusettingdir.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGDIR_H +#define MENUSETTINGDIR_H + +#include "gmenu2x.h" +#include "menusetting.h" + +using std::string; + +class MenuSettingDir : public MenuSetting { +private: + string originalValue; + string *_value; + GMenu2X *gmenu2x; + IconButton *btnClear, *btnSelect; + + void select(); + void clear(); + +public: + MenuSettingDir(GMenu2X *gmenu2x, string name, string description, string *value); + virtual ~MenuSettingDir() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + void setValue(string value); + string value(); +}; + +#endif diff --git a/src/menusettingfile.cpp b/src/menusettingfile.cpp new file mode 100644 index 0000000..5317226 --- /dev/null +++ b/src/menusettingfile.cpp @@ -0,0 +1,82 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingfile.h" +#include "filedialog.h" +#include "utilities.h" + +using namespace std; +using namespace fastdelegate; + +MenuSettingFile::MenuSettingFile(GMenu2X *gmenu2x, string name, string description, string *value, string filter) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + this->filter = filter; + _value = value; + originalValue = *value; + + btnClear = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Clear"]); + btnClear->setAction(MakeDelegate(this, &MenuSettingFile::clear)); + + btnSelect = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Select a file"]); + btnSelect->setAction(MakeDelegate(this, &MenuSettingFile::select)); +} + +void MenuSettingFile::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, value(), 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingFile::handleTS() { + btnSelect->handleTS(); + btnClear->handleTS(); +} + +void MenuSettingFile::manageInput() { + if ( gmenu2x->input[ACTION_X] ) setValue(""); + if ( gmenu2x->input[ACTION_B] ) select(); +} + +void MenuSettingFile::clear() { + setValue(""); +} + +void MenuSettingFile::select() { + FileDialog fd(gmenu2x, description, filter, value()); + if (fd.exec()) setValue( fd.path()+"/"+fd.file ); +} + +void MenuSettingFile::setValue(string value) { + *_value = value; +} + +string MenuSettingFile::value() { + return *_value; +} + +void MenuSettingFile::adjustInput() {} + +void MenuSettingFile::drawSelected(int) { + gmenu2x->drawButton(btnClear, + gmenu2x->drawButton(btnSelect)); +} + +bool MenuSettingFile::edited() { + return originalValue != value(); +} diff --git a/src/menusettingfile.h b/src/menusettingfile.h new file mode 100644 index 0000000..811a101 --- /dev/null +++ b/src/menusettingfile.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGFILE_H +#define MENUSETTINGFILE_H + +#include "gmenu2x.h" +#include "menusetting.h" + +using std::string; + +class MenuSettingFile : public MenuSetting { +protected: + string originalValue; + string *_value; + string filter; + GMenu2X *gmenu2x; + IconButton *btnClear, *btnSelect; + + void select(); + void clear(); + +public: + MenuSettingFile(GMenu2X *gmenu2x, string name, string description, string *value, string filter=""); + virtual ~MenuSettingFile() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + virtual void setValue(string value); + string value(); +}; + +#endif diff --git a/src/menusettingimage.cpp b/src/menusettingimage.cpp new file mode 100644 index 0000000..6726e76 --- /dev/null +++ b/src/menusettingimage.cpp @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingimage.h" +#include "imagedialog.h" +#include "utilities.h" + +using namespace std; + +MenuSettingImage::MenuSettingImage(GMenu2X *gmenu2x, string name, string description, string *value, string filter) + : MenuSettingFile(gmenu2x,name,description,value,filter) { + this->gmenu2x = gmenu2x; + this->filter = filter; + _value = value; + originalValue = *value; +} + +void MenuSettingImage::manageInput() { + if ( gmenu2x->input[ACTION_X] ) setValue(""); + if ( gmenu2x->input[ACTION_B] ) { + ImageDialog id(gmenu2x, description, filter, value()); + if (id.exec()) setValue( id.path()+"/"+id.file ); + } +} + +void MenuSettingImage::setValue(string value) { + string skinpath = gmenu2x->getExePath()+"skins/"+gmenu2x->confStr["skin"]; + bool inSkinDir = value.substr(0,skinpath.length()) == skinpath; + if (!inSkinDir && gmenu2x->confStr["skin"] != "Default") { + skinpath = gmenu2x->getExePath()+"skins/Default"; + inSkinDir = value.substr(0,skinpath.length()) == skinpath; + } + if (inSkinDir) { + string tempIcon = value.substr(skinpath.length(), value.length()); + string::size_type pos = tempIcon.find("/"); + if (pos != string::npos) + value = "skin:"+tempIcon.substr(pos+1,value.length()); + } + *_value = value; +} diff --git a/src/menusettingimage.h b/src/menusettingimage.h new file mode 100644 index 0000000..11ed068 --- /dev/null +++ b/src/menusettingimage.h @@ -0,0 +1,37 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGIMAGE_H +#define MENUSETTINGIMAGE_H + +#include "gmenu2x.h" +#include "menusettingfile.h" + +using std::string; + +class MenuSettingImage : public MenuSettingFile { +public: + MenuSettingImage(GMenu2X *gmenu2x, string name, string description, string *value, string filter=""); + virtual ~MenuSettingImage() {}; + + virtual void manageInput(); + virtual void setValue(string value); +}; + +#endif diff --git a/src/menusettingint.cpp b/src/menusettingint.cpp new file mode 100644 index 0000000..b72112d --- /dev/null +++ b/src/menusettingint.cpp @@ -0,0 +1,106 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingint.h" +#include "utilities.h" +#include + +using namespace std; +using namespace fastdelegate; + +MenuSettingInt::MenuSettingInt(GMenu2X *gmenu2x, string name, string description, int *value, int min, int max) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + _value = value; + originalValue = *value; + this->min = min; + this->max = max; + setValue(this->value()); + + //Delegates + ButtonAction actionInc = MakeDelegate(this, &MenuSettingInt::inc); + ButtonAction actionDec = MakeDelegate(this, &MenuSettingInt::dec); + + btnInc = new IconButton(gmenu2x, "skin:imgs/buttons/y.png", gmenu2x->tr["Increase value"]); + btnInc->setAction(actionInc); + + btnDec = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Decrease value"]); + btnDec->setAction(actionDec); + + btnInc2 = new IconButton(gmenu2x, "skin:imgs/buttons/right.png"); + btnInc2->setAction(actionInc); + + btnDec2 = new IconButton(gmenu2x, "skin:imgs/buttons/left.png"); + btnDec2->setAction(actionDec); +} + +void MenuSettingInt::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, strvalue, 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingInt::handleTS() { + btnInc->handleTS(); + btnDec->handleTS(); + btnInc2->handleTS(); + btnDec2->handleTS(); +} + +void MenuSettingInt::manageInput() { + if ( gmenu2x->input[ACTION_LEFT ] || gmenu2x->input[ACTION_X] ) dec(); + if ( gmenu2x->input[ACTION_RIGHT] || gmenu2x->input[ACTION_Y] ) inc(); +} + +void MenuSettingInt::inc() { + setValue(value()+1); +} + +void MenuSettingInt::dec() { + setValue(value()-1); +} + +void MenuSettingInt::setValue(int value) { + *_value = constrain(value,min,max); + stringstream ss; + ss << *_value; + strvalue = ""; + ss >> strvalue; +} + +int MenuSettingInt::value() { + return *_value; +} + +void MenuSettingInt::adjustInput() { +#ifdef TARGET_GP2X + gmenu2x->input.setInterval(30, ACTION_LEFT ); + gmenu2x->input.setInterval(30, ACTION_RIGHT); +#endif +} + +void MenuSettingInt::drawSelected(int) { + gmenu2x->drawButton(btnInc, + gmenu2x->drawButton(btnInc2, + gmenu2x->drawButton(btnDec, + gmenu2x->drawButton(btnDec2)-10))-10); +} + +bool MenuSettingInt::edited() { + return originalValue != value(); +} diff --git a/src/menusettingint.h b/src/menusettingint.h new file mode 100644 index 0000000..57158ff --- /dev/null +++ b/src/menusettingint.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGINT_H +#define MENUSETTINGINT_H + +#include "iconbutton.h" +#include "menusetting.h" +#include "FastDelegate.h" + +using std::string; +class GMenu2X; + +class MenuSettingInt : public MenuSetting { +private: + int originalValue; + int *_value; + string strvalue; + IconButton *btnInc, *btnDec, *btnInc2, *btnDec2; + GMenu2X *gmenu2x; + + void inc(); + void dec(); + +public: + MenuSettingInt(GMenu2X *gmenu2x, string name, string description, int *value, int min, int max); + virtual ~MenuSettingInt() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + int min, max; + virtual void setValue(int value); + int value(); +}; + +#endif diff --git a/src/menusettingmultistring.cpp b/src/menusettingmultistring.cpp new file mode 100644 index 0000000..220c886 --- /dev/null +++ b/src/menusettingmultistring.cpp @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingmultistring.h" +#include "utilities.h" + +using namespace std; +using namespace fastdelegate; + +MenuSettingMultiString::MenuSettingMultiString(GMenu2X *gmenu2x, string name, string description, string *value, vector *choices) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + this->choices = choices; + this->value = value; + originalValue = *value; + setSel( find(choices->begin(),choices->end(),*value)-choices->begin() ); + + btnDec = new IconButton(gmenu2x, "skin:imgs/buttons/left.png"); + btnDec->setAction(MakeDelegate(this, &MenuSettingMultiString::decSel)); + + btnInc = new IconButton(gmenu2x, "skin:imgs/buttons/right.png", gmenu2x->tr["Change value"]); + btnInc->setAction(MakeDelegate(this, &MenuSettingMultiString::incSel)); +} + +void MenuSettingMultiString::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, *value, 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingMultiString::handleTS() { + btnDec->handleTS(); + btnInc->handleTS(); +} + +void MenuSettingMultiString::manageInput() { + if ( gmenu2x->input[ACTION_LEFT ] ) decSel(); + if ( gmenu2x->input[ACTION_RIGHT] ) incSel(); +} + +void MenuSettingMultiString::incSel() { + setSel(selected+1); +} + +void MenuSettingMultiString::decSel() { + setSel(selected-1); +} + +void MenuSettingMultiString::setSel(int sel) { + if (sel<0) sel = choices->size()-1; + else if (sel>=(int)choices->size()) sel = 0; + selected = sel; + *value = (*choices)[sel]; +} + +void MenuSettingMultiString::adjustInput() {} + +void MenuSettingMultiString::drawSelected(int) { + gmenu2x->drawButton(btnInc, + gmenu2x->drawButton(btnDec)-6); +} + +bool MenuSettingMultiString::edited() { + return originalValue != *value; +} diff --git a/src/menusettingmultistring.h b/src/menusettingmultistring.h new file mode 100644 index 0000000..e90df47 --- /dev/null +++ b/src/menusettingmultistring.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGMULTISTRING_H +#define MENUSETTINGMULTISTRING_H + +#include "gmenu2x.h" +#include "menusetting.h" + +using std::string; + +class MenuSettingMultiString : public MenuSetting { +private: + uint selected; + string *value; + string originalValue; + vector *choices; + GMenu2X *gmenu2x; + IconButton *btnDec, *btnInc; + + void incSel(); + void decSel(); + void setSel(int); + +public: + MenuSettingMultiString(GMenu2X *gmenu2x, string name, string description, string *value, vector *choices); + virtual ~MenuSettingMultiString() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); +}; + +#endif diff --git a/src/menusettingrgba.cpp b/src/menusettingrgba.cpp new file mode 100644 index 0000000..98fc459 --- /dev/null +++ b/src/menusettingrgba.cpp @@ -0,0 +1,168 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingrgba.h" +#include + +using namespace std; +using namespace fastdelegate; + +MenuSettingRGBA::MenuSettingRGBA(GMenu2X *gmenu2x, string name, string description, RGBAColor *value) + : MenuSetting(gmenu2x,name,description) { + selPart = 0; + this->gmenu2x = gmenu2x; + _value = value; + originalValue = *value; + this->setR(this->value().r); + this->setG(this->value().g); + this->setB(this->value().b); + this->setA(this->value().a); + + btnDec = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Decrease"]); + btnDec->setAction(MakeDelegate(this, &MenuSettingRGBA::dec)); + + btnInc = new IconButton(gmenu2x, "skin:imgs/buttons/y.png", gmenu2x->tr["Increase"]); + btnInc->setAction(MakeDelegate(this, &MenuSettingRGBA::inc)); + + btnLeftComponent = new IconButton(gmenu2x, "skin:imgs/buttons/left.png"); + btnLeftComponent->setAction(MakeDelegate(this, &MenuSettingRGBA::leftComponent)); + + btnRightComponent = new IconButton(gmenu2x, "skin:imgs/buttons/right.png", gmenu2x->tr["Change color component"]); + btnRightComponent->setAction(MakeDelegate(this, &MenuSettingRGBA::rightComponent)); +} + +void MenuSettingRGBA::draw(int y) { + this->y = y; + MenuSetting::draw(y); + gmenu2x->s->rectangle( 153, y+1, 11, 11, 0,0,0,255 ); + gmenu2x->s->box( 154, y+2, 9, 9, value() ); + gmenu2x->s->write( gmenu2x->font, "R: "+strR, 169, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); + gmenu2x->s->write( gmenu2x->font, "G: "+strG, 205, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); + gmenu2x->s->write( gmenu2x->font, "B: "+strB, 241, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); + gmenu2x->s->write( gmenu2x->font, "A: "+strA, 277, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingRGBA::handleTS() { + if (gmenu2x->ts.pressed()) + for (int i=0; i<4; i++) + if (i!=selPart && gmenu2x->ts.inRect(166+i*36,y,36,14)) { + selPart = i; + i = 4; + } + + btnDec->handleTS(); + btnInc->handleTS(); + btnLeftComponent->handleTS(); + btnRightComponent->handleTS(); +} + +void MenuSettingRGBA::manageInput() { + if ( gmenu2x->input[ACTION_Y ]) inc(); + if ( gmenu2x->input[ACTION_X ]) dec(); + if ( gmenu2x->input[ACTION_LEFT ]) leftComponent(); + if ( gmenu2x->input[ACTION_RIGHT]) rightComponent(); +} + +void MenuSettingRGBA::dec() { + setSelPart( constrain(getSelPart()-1,0,255) ); +} + +void MenuSettingRGBA::inc() { + setSelPart( constrain(getSelPart()+1,0,255) ); +} + +void MenuSettingRGBA::leftComponent() { + selPart = constrain(selPart-1,0,3); +} + +void MenuSettingRGBA::rightComponent() { + selPart = constrain(selPart+1,0,3); +} + +void MenuSettingRGBA::setR(unsigned short r) { + _value->r = r; + stringstream ss; + ss << r; + ss >> strR; +} + +void MenuSettingRGBA::setG(unsigned short g) { + _value->g = g; + stringstream ss; + ss << g; + ss >> strG; +} + +void MenuSettingRGBA::setB(unsigned short b) { + _value->b = b; + stringstream ss; + ss << b; + ss >> strB; +} + +void MenuSettingRGBA::setA(unsigned short a) { + _value->a = a; + stringstream ss; + ss << a; + ss >> strA; +} + +void MenuSettingRGBA::setSelPart(unsigned short value) { + switch (selPart) { + default: case 0: setR(value); break; + case 1: setG(value); break; + case 2: setB(value); break; + case 3: setA(value); break; + } +} + +RGBAColor MenuSettingRGBA::value() { + return *_value; +} + +unsigned short MenuSettingRGBA::getSelPart() { + switch (selPart) { + default: case 0: return value().r; + case 1: return value().g; + case 2: return value().b; + case 3: return value().a; + } +} + +void MenuSettingRGBA::adjustInput() { +#ifdef TARGET_GP2X + gmenu2x->input.setInterval(30, ACTION_Y ); + gmenu2x->input.setInterval(30, ACTION_X ); + gmenu2x->input.setInterval(30, ACTION_L ); +#endif +} + +void MenuSettingRGBA::drawSelected(int y) { + int x = 166+selPart*36; + gmenu2x->s->box( x, y, 36, 14, gmenu2x->skinConfColors["selectionBg"] ); + + gmenu2x->drawButton(btnDec, + gmenu2x->drawButton(btnInc, + gmenu2x->drawButton(btnRightComponent, + gmenu2x->drawButton(btnLeftComponent)-6))); +} + +bool MenuSettingRGBA::edited() { + return originalValue.r != value().r || originalValue.g != value().g || originalValue.b != value().b || originalValue.a != value().a; +} diff --git a/src/menusettingrgba.h b/src/menusettingrgba.h new file mode 100644 index 0000000..f5b0d0a --- /dev/null +++ b/src/menusettingrgba.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGRGBA_H +#define MENUSETTINGRGBA_H + +#include "gmenu2x.h" +#include "menusetting.h" +#include "utilities.h" + +using std::string; + +class MenuSettingRGBA : public MenuSetting { +private: + unsigned short selPart; + int y; + string strR, strG, strB, strA; + RGBAColor originalValue; + RGBAColor *_value; + GMenu2X *gmenu2x; + IconButton *btnDec, *btnInc, *btnLeftComponent, *btnRightComponent; + + void dec(); + void inc(); + void leftComponent(); + void rightComponent(); + +public: + MenuSettingRGBA(GMenu2X *gmenu2x, string name, string description, RGBAColor *value); + virtual ~MenuSettingRGBA() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + void setSelPart(unsigned short value); + void setR(unsigned short r); + void setG(unsigned short g); + void setB(unsigned short b); + void setA(unsigned short a); + unsigned short getSelPart(); + RGBAColor value(); +}; + +#endif diff --git a/src/menusettingstring.cpp b/src/menusettingstring.cpp new file mode 100644 index 0000000..3886370 --- /dev/null +++ b/src/menusettingstring.cpp @@ -0,0 +1,82 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "menusettingstring.h" +#include "inputdialog.h" +#include "utilities.h" + +using namespace std; +using namespace fastdelegate; + +MenuSettingString::MenuSettingString(GMenu2X *gmenu2x, string name, string description, string *value, string diagTitle, string diagIcon) + : MenuSetting(gmenu2x,name,description) { + this->gmenu2x = gmenu2x; + _value = value; + originalValue = *value; + this->diagTitle = diagTitle; + this->diagIcon = diagIcon; + + btnClear = new IconButton(gmenu2x, "skin:imgs/buttons/x.png", gmenu2x->tr["Clear"]); + btnClear->setAction(MakeDelegate(this, &MenuSettingString::clear)); + + btnEdit = new IconButton(gmenu2x, "skin:imgs/buttons/b.png", gmenu2x->tr["Edit"]); + btnEdit->setAction(MakeDelegate(this, &MenuSettingString::edit)); +} + +void MenuSettingString::draw(int y) { + MenuSetting::draw(y); + gmenu2x->s->write( gmenu2x->font, value(), 155, y+gmenu2x->font->getHalfHeight(), SFontHAlignLeft, SFontVAlignMiddle ); +} + +void MenuSettingString::handleTS() { + btnEdit->handleTS(); +} + +void MenuSettingString::manageInput() { + if ( gmenu2x->input[ACTION_X] ) clear(); + if ( gmenu2x->input[ACTION_B] ) edit(); +} + +void MenuSettingString::setValue(string value) { + *_value = value; +} + +string MenuSettingString::value() { + return *_value; +} + +void MenuSettingString::adjustInput() {} + +void MenuSettingString::clear() { + setValue(""); +} + +void MenuSettingString::edit() { + InputDialog id(gmenu2x,description,value(), diagTitle,diagIcon); + if (id.exec()) setValue(id.input); +} + +void MenuSettingString::drawSelected(int) { + gmenu2x->drawButton(btnClear, + gmenu2x->drawButton(btnEdit)); +} + +bool MenuSettingString::edited() { + return originalValue != value(); +} diff --git a/src/menusettingstring.h b/src/menusettingstring.h new file mode 100644 index 0000000..4b45395 --- /dev/null +++ b/src/menusettingstring.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MENUSETTINGSTRING_H +#define MENUSETTINGSTRING_H + +#include "gmenu2x.h" +#include "menusetting.h" + +using std::string; + +class MenuSettingString : public MenuSetting { +private: + string originalValue, diagTitle, diagIcon; + string *_value; + GMenu2X *gmenu2x; + IconButton *btnClear, *btnEdit; + + void edit(); + void clear(); + +public: + MenuSettingString(GMenu2X *gmenu2x, string name, string description, string *value, string diagTitle="", string diagIcon=""); + virtual ~MenuSettingString() {}; + + virtual void draw(int y); + virtual void handleTS(); + virtual void manageInput(); + virtual void adjustInput(); + virtual void drawSelected(int y); + virtual bool edited(); + + void setValue(string value); + string value(); +}; + +#endif diff --git a/src/messagebox.cpp b/src/messagebox.cpp new file mode 100644 index 0000000..43c9f8a --- /dev/null +++ b/src/messagebox.cpp @@ -0,0 +1,120 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +#include "messagebox.h" + +using namespace std; + +MessageBox::MessageBox(GMenu2X *gmenu2x, string text, string icon) { + this->gmenu2x = gmenu2x; + this->text = text; + this->icon = icon; + + buttons.resize(19); + buttonLabels.resize(19); + buttonPositions.resize(19); + for (uint x=0; xfont->getHeight(); + } + + //Default enabled button + buttons[ACTION_B] = "OK"; + + //Default labels + buttonLabels[ACTION_UP] = "up"; + buttonLabels[ACTION_DOWN] = "down"; + buttonLabels[ACTION_LEFT] = "left"; + buttonLabels[ACTION_RIGHT] = "right"; + buttonLabels[ACTION_A] = "a"; + buttonLabels[ACTION_B] = "b"; + buttonLabels[ACTION_X] = "x"; + buttonLabels[ACTION_Y] = "y"; + buttonLabels[ACTION_L] = "l"; + buttonLabels[ACTION_R] = "r"; + buttonLabels[ACTION_START] = "start"; + buttonLabels[ACTION_SELECT] = "select"; + buttonLabels[ACTION_VOLUP] = "vol+"; + buttonLabels[ACTION_VOLDOWN] = "vol-"; +} + +int MessageBox::exec() { + int result = -1; + + Surface bg(gmenu2x->s); + //Darken background + bg.box(0, 0, gmenu2x->resX, gmenu2x->resY, 0,0,0,200); + + SDL_Rect box; + box.h = gmenu2x->font->getHeight()*3 +4; + box.w = gmenu2x->font->getTextWidth(text) + 24 + (gmenu2x->sc[icon] != NULL ? 37 : 0); + box.x = gmenu2x->halfX - box.w/2 -2; + box.y = gmenu2x->halfY - box.h/2 -2; + + //outer box + bg.box(box, gmenu2x->skinConfColors["messageBoxBg"]); + //draw inner rectangle + bg.rectangle(box.x+2, box.y+2, box.w-4, box.h-gmenu2x->font->getHeight(), gmenu2x->skinConfColors["messageBoxBorder"]); + //icon+text + if (gmenu2x->sc[icon] != NULL) + gmenu2x->sc[icon]->blitCenter( &bg, box.x+25, box.y+gmenu2x->font->getHeight()+3 ); + bg.write( gmenu2x->font, text, box.x+(gmenu2x->sc[icon] != NULL ? 47 : 10), box.y+gmenu2x->font->getHeight()+3, SFontHAlignLeft, SFontVAlignMiddle ); + + int btnX = gmenu2x->halfX+box.w/2-6; + for (uint i=0; idrawButtonRight(&bg, buttonLabels[i], buttons[i], btnX, buttonPositions[i].y); + + buttonPositions[i].x = btnX; + buttonPositions[i].w = buttonPositions[i].x-btnX-6; + } + } + + bg.blit(gmenu2x->s,0,0); + gmenu2x->s->flip(); + + while (result<0) { + //touchscreen + if (gmenu2x->f200) { + if (gmenu2x->ts.poll()) { + for (uint i=0; its.inRect(buttonPositions[i])) { + result = i; + i = buttons.size(); + } + } + } + + gmenu2x->input.update(); + for (uint i=0; iinput[i]) result = i; + + usleep(LOOP_DELAY); + } + + return result; +} diff --git a/src/messagebox.h b/src/messagebox.h new file mode 100644 index 0000000..3bfe17d --- /dev/null +++ b/src/messagebox.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef MESSAGEBOX_H_ +#define MESSAGEBOX_H_ + +#define MB_BTN_B 0 +#define MB_BTN_X 1 +#define MB_BTN_START 2 +#define MB_BTN_SELECT 3 + +#include +#include "gmenu2x.h" + +using std::string; +using std::vector; + +class MessageBox { +private: + string text, icon; + GMenu2X *gmenu2x; + +public: + MessageBox(GMenu2X *gmenu2x, string text, string icon=""); + vector buttons; + vector buttonLabels; + vector buttonPositions; + int exec(); +}; + +#endif /*MESSAGEBOX_H_*/ diff --git a/src/pxml.cpp b/src/pxml.cpp new file mode 100644 index 0000000..f495892 --- /dev/null +++ b/src/pxml.cpp @@ -0,0 +1,127 @@ +#include "pxml.h" +#include "tinyxml/tinyxml.h" +#include + +using namespace std; + +PXml::PXml(string file) { + valid = false; + error = title = description = authorName = authorWebsite = category = exec = icon = ""; + version = osVersion = (SoftwareVersion){0,0,0,0}; + + TiXmlDocument doc(file.c_str()); + if (doc.LoadFile()) { + TiXmlHandle hDoc(&doc); + TiXmlElement* pElem; + + pElem = hDoc.FirstChildElement().Element(); + TiXmlHandle hPXML(pElem); + if (pElem) pElem = hPXML.FirstChildElement( "title" ).Element(); + if (pElem) { + title = pElem->GetText(); + pElem = hPXML.FirstChildElement( "description" ).Element(); + } + if (pElem) { + description = pElem->GetText(); + pElem = hPXML.FirstChildElement( "author" ).Element(); + } + if (pElem) { + authorName = pElem->Attribute("name"); + authorWebsite = pElem->Attribute("website"); + + pElem = hPXML.FirstChildElement( "version" ).Element(); + } + if (pElem) { + pElem->QueryIntAttribute("major", &version.major); + pElem->QueryIntAttribute("minor", &version.minor); + pElem->QueryIntAttribute("release", &version.release); + pElem->QueryIntAttribute("build", &version.build); + + pElem = hPXML.FirstChildElement( "exec" ).Element(); + } + if (pElem) { + exec = pElem->GetText(); + + pElem = hPXML.FirstChildElement( "category" ).Element(); + } + if (pElem) { + category = pElem->GetText(); + + valid = true; + + //All required fields have been found, parsing optional fields + pElem = hPXML.FirstChildElement("icon").Element(); + if (pElem) icon = pElem->GetText(); + + pElem = hPXML.FirstChildElement( "osversion" ).Element(); + if (pElem) { + pElem->QueryIntAttribute("major", &osVersion.major); + pElem->QueryIntAttribute("minor", &osVersion.minor); + pElem->QueryIntAttribute("release", &osVersion.release); + pElem->QueryIntAttribute("build", &osVersion.build); + } + } + } else { + error = doc.ErrorDesc(); + } +} + +bool PXml::isValid() { + return valid; +} + +string PXml::getTitle() { + return title; +} + +string PXml::getDescription() { + return description; +} + +string PXml::getAuthorName() { + return authorName; +} + +string PXml::getAuthorWebsite() { + return authorWebsite; +} + +string PXml::getCategory() { + return category; +} + +string PXml::getExec() { + return exec; +} + +string PXml::getIcon() { + return icon; +} + +SoftwareVersion PXml::getVersion() { + return version; +} + +string PXml::getVersionString() { + string versionString = ""; + stringstream ss; + ss << version.major << "." << version.minor << "." << version.release << "." << version.build; + ss >> versionString; + return versionString; +} + +SoftwareVersion PXml::getOsVersion() { + return osVersion; +} + +string PXml::getOsVersionString() { + string versionString = ""; + stringstream ss; + ss << osVersion.major << "." << osVersion.minor << "." << osVersion.release << "." << osVersion.build; + ss >> versionString; + return versionString; +} + +string PXml::getError() { + return error; +} diff --git a/src/pxml.h b/src/pxml.h new file mode 100644 index 0000000..451bcb3 --- /dev/null +++ b/src/pxml.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef PXML_H_ +#define PXML_H_ + +#include + +using std::string; + +struct SoftwareVersion { + int major, minor, release, build; +}; + +class PXml { +private: + bool valid; + string title, description, error, authorName, authorWebsite, category, exec, icon; + SoftwareVersion version, osVersion; + +public: + PXml(string file); + + bool isValid(); + + string getTitle(); + string getDescription(); + string getAuthorName(); + string getAuthorWebsite(); + string getCategory(); + string getExec(); + string getIcon(); + + SoftwareVersion getVersion(); + string getVersionString(); + SoftwareVersion getOsVersion(); + string getOsVersionString(); + + string getError(); +}; + +#endif /*PXML_H_*/ diff --git a/src/selector.cpp b/src/selector.cpp new file mode 100644 index 0000000..0bc8d17 --- /dev/null +++ b/src/selector.cpp @@ -0,0 +1,244 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +//for browsing the filesystem +#include +#include +#include + +#include "menu.h" +#include "linkapp.h" +#include "selector.h" +#include "filelister.h" + +using namespace std; + +Selector::Selector(GMenu2X *gmenu2x, LinkApp *link, string selectorDir) { + this->gmenu2x = gmenu2x; + this->link = link; + loadAliases(); + selRow = 0; + if (selectorDir=="") + dir = link->getSelectorDir(); + else + dir = selectorDir; + if (dir[dir.length()-1]!='/') dir += "/"; +} + +int Selector::exec(int startSelection) { + bool close = false, result = true; + vector screens, titles; + + FileLister fl(dir, link->getSelectorBrowser()); + fl.setFilter(link->getSelectorFilter()); + fl.browse(); + + Surface bg(gmenu2x->bg); + gmenu2x->drawTitleIcon(link->getIconPath(),true,&bg); + gmenu2x->writeTitle(link->getTitle(),&bg); + gmenu2x->writeSubTitle(link->getDescription(),&bg); + + if (link->getSelectorBrowser()) { + gmenu2x->drawButton(&bg, "start", gmenu2x->tr["Exit"], + gmenu2x->drawButton(&bg, "b", gmenu2x->tr["Select a file"], + gmenu2x->drawButton(&bg, "x", gmenu2x->tr["Up one folder"], 5))); + } else { + gmenu2x->drawButton(&bg, "x", gmenu2x->tr["Exit"], + gmenu2x->drawButton(&bg, "b", gmenu2x->tr["Select a file"], 5)); + } + + Uint32 selTick = SDL_GetTicks(), curTick; + uint i, firstElement = 0, iY; + + prepare(&fl,&screens,&titles); + uint selected = constrain(startSelection,0,fl.size()-1); + + //Add the folder icon manually to be sure to load it with alpha support since we are going to disable it for screenshots + if (gmenu2x->sc.skinRes("imgs/folder.png")==NULL) + gmenu2x->sc.addSkinRes("imgs/folder.png"); + gmenu2x->sc.defaultAlpha = false; + while (!close) { + bg.blit(gmenu2x->s,0,0); + + if (selected>=firstElement+SELECTOR_ELEMENTS) firstElement=selected-SELECTOR_ELEMENTS+1; + if (selecteds->box(1, iY, 309, 14, gmenu2x->skinConfColors["selectionBg"]); + + //Screenshot + if (selected-fl.dirCount()200) + gmenu2x->sc[screens[selected-fl.dirCount()]]->blitRight(gmenu2x->s, 311, 42, 160, 160, min((curTick-selTick-200)/3,255)); + } + + //Files & Dirs + gmenu2x->s->setClipRect(0,41,311,179); + for (i=firstElement; isc["imgs/folder.png"]->blit(gmenu2x->s, 4, 42+(iY*16)); + gmenu2x->s->write(gmenu2x->font, fl[i], 21, 49+(iY*16), SFontHAlignLeft, SFontVAlignMiddle); + } else + gmenu2x->s->write(gmenu2x->font, titles[i-fl.dirCount()], 4, 49+(iY*16), SFontHAlignLeft, SFontVAlignMiddle); + } + gmenu2x->s->clearClipRect(); + + gmenu2x->drawScrollBar(SELECTOR_ELEMENTS,fl.size(),firstElement,42,175); + gmenu2x->s->flip(); + + + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_START] ) { close = true; result = false; } + if ( gmenu2x->input[ACTION_UP] ) { + if (selected==0) { + selected = fl.size()-1; + } else { + selected -= 1; + } + selTick = SDL_GetTicks(); + } + if ( gmenu2x->input[ACTION_L] ) { + if ((int)(selected-SELECTOR_ELEMENTS+1)<0) { + selected = 0; + } else { + selected -= SELECTOR_ELEMENTS-1; + } + selTick = SDL_GetTicks(); + } + if ( gmenu2x->input[ACTION_DOWN] ) { + if (selected+1>=fl.size()) { + selected = 0; + } else { + selected += 1; + } + selTick = SDL_GetTicks(); + } + if ( gmenu2x->input[ACTION_R] ) { + if (selected+SELECTOR_ELEMENTS-1>=fl.size()) { + selected = fl.size()-1; + } else { + selected += SELECTOR_ELEMENTS-1; + } + selTick = SDL_GetTicks(); + } + if ( gmenu2x->input[ACTION_X] ) { + if (link->getSelectorBrowser()) { + string::size_type p = dir.rfind("/", dir.size()-2); + if (p==string::npos || dir.substr(0,4)!="/card" || p<4) { + close = true; + result = false; + } else { + dir = dir.substr(0,p+1); + cout << dir << endl; + selected = 0; + firstElement = 0; + prepare(&fl,&screens,&titles); + } + } else { + close = true; + result = false; + } + } + if ( gmenu2x->input[ACTION_B] ) { + if (fl.isFile(selected)) { + file = fl[selected]; + close = true; + } else { + dir = dir+fl[selected]+"/"; + selected = 0; + firstElement = 0; + prepare(&fl,&screens,&titles); + } + } + } + gmenu2x->sc.defaultAlpha = true; + freeScreenshots(&screens); + + return result ? (int)selected : -1; +} + +void Selector::prepare(FileLister *fl, vector *screens, vector *titles) { + fl->setPath(dir); + freeScreenshots(screens); + screens->resize(fl->files.size()); + titles->resize(fl->files.size()); + + string screendir = link->getSelectorScreens(); + if (screendir != "" && screendir[screendir.length()-1]!='/') screendir += "/"; + + string noext; + string::size_type pos; + for (uint i=0; ifiles.size(); i++) { + noext = fl->files[i]; + pos = noext.rfind("."); + if (pos!=string::npos && pos>0) + noext = noext.substr(0, pos); + titles->at(i) = getAlias(noext); + if (titles->at(i)=="") + titles->at(i) = noext; +#ifdef DEBUG + cout << "\033[0;34mGMENU2X:\033[0m Searching for screen " << screendir << noext << ".png" << endl; +#endif + if (fileExists(screendir+noext+".png")) + screens->at(i) = screendir+noext+".png"; + else if (fileExists(screendir+noext+".jpg")) + screens->at(i) = screendir+noext+".jpg"; + else + screens->at(i) = ""; + } +} + +void Selector::freeScreenshots(vector *screens) { + for (uint i=0; isize(); i++) { + if (screens->at(i) != "") + gmenu2x->sc.del(screens->at(i)); + } +} + +void Selector::loadAliases() { + aliases.clear(); + if (fileExists(link->getAliasFile())) { + string line; + ifstream infile (link->getAliasFile().c_str(), ios_base::in); + while (getline(infile, line, '\n')) { + string::size_type position = line.find("="); + string name = trim(line.substr(0,position)); + string value = trim(line.substr(position+1)); + aliases[name] = value; + } + infile.close(); + } +} + +string Selector::getAlias(string key) { + hash_map::iterator i = aliases.find(key); + if (i == aliases.end()) + return ""; + else + return i->second; +} diff --git a/src/selector.h b/src/selector.h new file mode 100644 index 0000000..c9a5fa4 --- /dev/null +++ b/src/selector.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef SELECTOR_H_ +#define SELECTOR_H_ + +#include +#include "gmenu2x.h" +#include "utilities.h" + +#define SELECTOR_ELEMENTS 11 + +class LinkApp; +class FileLister; + +using std::string; +using std::vector; + +class Selector { +private: + int selRow; + GMenu2X *gmenu2x; + LinkApp *link; + + hash_map aliases; + void loadAliases(); + string getAlias(string key); + void prepare(FileLister *fl, vector *screens, vector *titles); + void freeScreenshots(vector *screens); + +public: + string file, dir; + Selector(GMenu2X *gmenu2x, LinkApp *link, string selectorDir=""); + + int exec(int startSelection=0); +}; + +#endif /*SELECTOR_H_*/ diff --git a/src/selectordetector.cpp b/src/selectordetector.cpp new file mode 100644 index 0000000..9ce639d --- /dev/null +++ b/src/selectordetector.cpp @@ -0,0 +1,47 @@ +#include +#include + +#include "selectordetector.h" +#include "utilities.h" + +using namespace std; + +SelectorDetector::SelectorDetector() { + //ctor + useSelectorBackground = false; +} + +SelectorDetector::SelectorDetector(string config) { + useSelectorBackground = false; + readSelectorConfig(config); +} + +SelectorDetector::~SelectorDetector() { + //dtor +} + +bool SelectorDetector::readSelectorConfig(string config) { + if (fileExists(config)) { + ifstream inf(config.c_str(), ios_base::in); + if (inf.is_open()) { + string line; + while (getline(inf, line, '\n')) { + string::size_type pos = line.find("="); + string name = trim(line.substr(0,pos)); + string value = trim(line.substr(pos+1,line.length())); + + if (name=="cmdLine") application = value; + else if (name=="baseDir") filePath = value; + else if (name=="fileFilter"){ + if(filters.empty()) + filters = value; + else + filters += ("," + value); + } + } + inf.close(); + return true; + } + } + return false; +} diff --git a/src/selectordetector.h b/src/selectordetector.h new file mode 100644 index 0000000..7c279c5 --- /dev/null +++ b/src/selectordetector.h @@ -0,0 +1,58 @@ +#ifndef SELECTORDETECTOR_H +#define SELECTORDETECTOR_H + +/* This class is for handling applications that use Kounch's Selector, to correctly import their settings to GMenu + * It provides interfaces to examine the dge file to detect Selector and from there, parse the config files. + */ + + + /* +#Selector configuration file +#Version 1.0 + +#selector-language english (and it doesn't work, crap) +langCode=EN // ignore +layoutCode=0 // ignore + +selectRectangle=2 // ignore + +#Full path to skin files +skinPath=./ // use possibly + +#command line +cmdLine=./race // USE + +#path to base directory for file explorer +baseDir=/boot/local/gmenu2x/roms/ngpc/ // USE + +#File filters // USE +fileFilter=ngp +fileFilter=ngc +fileFilter=npc + */ +#include + +using std::string; +class SelectorDetector +{ + public: + SelectorDetector(); + SelectorDetector(string config); + ~SelectorDetector(); + + bool readSelectorConfig(string config); + + string getApplication(){return application;} + string getFilePath(){return filePath;} + string getFilters(){return filters;} + + private: + bool useSelectorBackground; + string application; + string filePath; + string filters; + //bool isSelectorGPE(string gpe); + //string getSelectorConfig(string gpe); // Looks in the GPE for the location of the selectorconfig +}; + +#endif // SELECTORDETECTOR_H diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp new file mode 100644 index 0000000..51d0df6 --- /dev/null +++ b/src/settingsdialog.cpp @@ -0,0 +1,140 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +#include "settingsdialog.h" + +using namespace std; + +SettingsDialog::SettingsDialog(GMenu2X *gmenu2x, string text, string icon) { + this->gmenu2x = gmenu2x; + this->text = text; + + if (icon!="" && gmenu2x->sc[icon] != NULL) + this->icon = icon; + else + this->icon = "icons/generic.png"; +} + +SettingsDialog::~SettingsDialog() { + for (uint i=0; iconfStr["wallpaper"],false); + Surface bg(gmenu2x->bg); + + bool close = false, ts_pressed = false; + uint i, sel = 0, iY, firstElement = 0, action; + voices[sel]->adjustInput(); + + SDL_Rect clipRect = {0, gmenu2x->skinConfInt["topBarHeight"]+1, gmenu2x->resX-9, gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-25}; + SDL_Rect touchRect = {2, gmenu2x->skinConfInt["topBarHeight"]+4, gmenu2x->resX-12, clipRect.h}; + uint rowHeight = gmenu2x->font->getHeight()+1; // gp2x=15+1 / pandora=19+1 + uint numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight; + + while (!close) { + action = SD_NO_ACTION; + if (gmenu2x->f200) gmenu2x->ts.poll(); + + bg.blit(gmenu2x->s,0,0); + + gmenu2x->drawTopBar(gmenu2x->s); + //link icon + gmenu2x->drawTitleIcon(icon); + gmenu2x->writeTitle(text); + gmenu2x->drawBottomBar(gmenu2x->s); + + if (sel>firstElement+numRows-1) firstElement=sel-numRows+1; + if (selskinConfInt["topBarHeight"]+2+(iY*rowHeight); + gmenu2x->s->setClipRect(clipRect); + if (sels->box(1, iY, 148, rowHeight-2, gmenu2x->skinConfColors["selectionBg"]); + gmenu2x->s->clearClipRect(); + + //selected option + voices[sel]->drawSelected(iY); + + gmenu2x->s->setClipRect(clipRect); + if (ts_pressed && !gmenu2x->ts.pressed()) ts_pressed = false; + if (gmenu2x->f200 && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false; + for (i=firstElement; idraw(iY*rowHeight+gmenu2x->skinConfInt["topBarHeight"]+2); + if (gmenu2x->f200 && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, touchRect.y+(iY*rowHeight), touchRect.w, rowHeight)) { + ts_pressed = true; + sel = i; + } + } + gmenu2x->s->clearClipRect(); + + gmenu2x->drawScrollBar(numRows,voices.size(),firstElement,clipRect.y+1,clipRect.h); + + //description + gmenu2x->writeSubTitle(voices[sel]->description); + + gmenu2x->s->flip(); + voices[sel]->handleTS(); + + gmenu2x->input.update(); + if ( gmenu2x->input[ACTION_START] ) action = SD_ACTION_CLOSE; + if ( gmenu2x->input[ACTION_UP ] ) action = SD_ACTION_UP; + if ( gmenu2x->input[ACTION_DOWN ] ) action = SD_ACTION_DOWN; + voices[sel]->manageInput(); + + switch (action) { + case SD_ACTION_CLOSE: close = true; break; + case SD_ACTION_UP: { + if (sel==0) + sel = voices.size()-1; + else + sel -= 1; + gmenu2x->setInputSpeed(); + voices[sel]->adjustInput(); + } break; + case SD_ACTION_DOWN: { + sel += 1; + if (sel>=voices.size()) sel = 0; + gmenu2x->setInputSpeed(); + voices[sel]->adjustInput(); + } break; + } + } + + gmenu2x->setInputSpeed(); + return true; +} + +void SettingsDialog::addSetting(MenuSetting* set) { + voices.push_back(set); +} + +bool SettingsDialog::edited() { + for (uint i=0; iedited()) return true; + return false; +} diff --git a/src/settingsdialog.h b/src/settingsdialog.h new file mode 100644 index 0000000..0123efa --- /dev/null +++ b/src/settingsdialog.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2006 by Massimiliano Torromeo * + * massimiliano.torromeo@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef SETTINGSDIALOG_H_ +#define SETTINGSDIALOG_H_ + +#define SD_NO_ACTION 0 +#define SD_ACTION_CLOSE 1 +#define SD_ACTION_UP 2 +#define SD_ACTION_DOWN 3 + +#include +#include "gmenu2x.h" +#include "menusetting.h" + +using std::string; +using std::vector; + +class SettingsDialog { +private: + vector voices; + string text, icon; + GMenu2X *gmenu2x; + +public: + SettingsDialog(GMenu2X *gmenu2x, string text, string icon="skin:sections/settings.png"); + ~SettingsDialog(); + + bool edited(); + bool exec(); + void addSetting(MenuSetting* set); +}; + +#endif /*INPUTDIALOG_H_*/ diff --git a/src/sfontplus.cpp b/src/sfontplus.cpp new file mode 100644 index 0000000..4959a2f --- /dev/null +++ b/src/sfontplus.cpp @@ -0,0 +1,196 @@ +#include "sfontplus.h" + +#include +#include +#include + +using namespace std; + +Uint32 SFontPlus::getPixel(Sint32 x, Sint32 y) { + assert(x>=0); + assert(xw); + + Uint32 Bpp = surface->format->BytesPerPixel; + + // Get the pixel + switch(Bpp) { + case 1: + return *((Uint8 *)surface->pixels + y * surface->pitch + x); + break; + case 2: + return *((Uint16 *)surface->pixels + y * surface->pitch/2 + x); + break; + case 3: { // Format/endian independent + Uint8 *bits = ((Uint8 *)surface->pixels)+y*surface->pitch+x*Bpp; + Uint8 r, g, b; + r = *((bits)+surface->format->Rshift/8); + g = *((bits)+surface->format->Gshift/8); + b = *((bits)+surface->format->Bshift/8); + return SDL_MapRGB(surface->format, r, g, b); + } + break; + case 4: + return *((Uint32 *)surface->pixels + y * surface->pitch/4 + x); + break; + } + + return 0; +} + +SFontPlus::SFontPlus() { + surface = NULL; +} + +SFontPlus::SFontPlus(SDL_Surface* font) { + surface = NULL; + initFont(font); +} + +SFontPlus::SFontPlus(string font) { + surface = NULL; + initFont(font); +} + +SFontPlus::~SFontPlus() { + freeFont(); +} + +bool SFontPlus::utf8Code(unsigned char c) { + return (c>=194 && c<=198) || c==208 || c==209; + //return c>=194; +} + +void SFontPlus::initFont(string font, string characters) { + SDL_Surface *buf = IMG_Load(font.c_str()); + if (buf!=NULL) { + initFont( SDL_DisplayFormatAlpha(buf), characters ); + SDL_FreeSurface(buf); + } +} + +void SFontPlus::initFont(SDL_Surface *font, string characters) { + freeFont(); + this->characters = characters; + if (font==NULL) return; + + surface = font; + Uint32 pink = SDL_MapRGB(surface->format, 255,0,255); + +#ifdef _DEBUG + bool utf8 = false; + for (uint x=0; x128; + if (utf8) printf("%d\n", (unsigned char)characters[x]); + } +#endif + + uint c = 0; + + SDL_LockSurface(surface); + for (uint x=0; x<(uint)surface->w && cw && getPixel(x,0) == pink) x++; + charpos.push_back(x); + + //utf8 characters + if (c>0 && utf8Code(characters[c-1])) { + charpos.push_back(startx); + charpos.push_back(x); + c++; + } + + c++; + } + } + SDL_UnlockSurface(surface); + Uint32 colKey = getPixel(0,surface->h-1); + SDL_SetColorKey(surface, SDL_SRCCOLORKEY, colKey); + + string::size_type pos = characters.find("0")*2; + SDL_Rect srcrect = {charpos[pos], 1, charpos[pos+2] - charpos[pos], surface->h-1}; + uint y = srcrect.h+1; + bool nonKeyFound = false; + while (y-->0 && !nonKeyFound) { + uint x = srcrect.w+1; + while (x-->0 && !nonKeyFound) + nonKeyFound = getPixel(x+srcrect.x,y+srcrect.y) != colKey; + } + lineHeight = y+1; +} + +void SFontPlus::freeFont() { + if (surface!=NULL) { + SDL_FreeSurface(surface); + surface = NULL; + } +} + +void SFontPlus::write(SDL_Surface *s, string text, int x, int y) { + if (text.empty()) return; + + string::size_type pos; + SDL_Rect srcrect, dstrect; + + // these values won't change in the loop + srcrect.y = 1; + dstrect.y = y; + srcrect.h = dstrect.h = surface->h-1; + + for(uint i=0; iw; i++) { + //Utf8 characters + if (utf8Code(text[i]) && i+1h - 1; +} + +uint SFontPlus::getLineHeight() { + return lineHeight; +} diff --git a/src/sfontplus.h b/src/sfontplus.h new file mode 100644 index 0000000..9c9d7fb --- /dev/null +++ b/src/sfontplus.h @@ -0,0 +1,43 @@ +#ifndef SFONTPLUS_H +#define SFONTPLUS_H + +#include +#include +#include + +#define SFONTPLUS_CHARSET "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¿ÀÃÈÉÌÃÒÓÙÚÃÄËÃÖÜŸÂÊÎÔÛÅÃÕÑÆÇČĎĚĽĹŇÔŘŔŠŤŮŽàáèéìíòóùúýäëïöüÿâêîôûåãõñæçÄÄěľĺňôřŕšťžůðßÃÞþÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑØøąćęłńśżźĄĆĘÅŃŚŻŹ" +#ifdef _WIN32 + typedef unsigned int uint; +#endif +using std::vector; +using std::string; + +class SFontPlus { +private: + Uint32 getPixel(Sint32 x, Sint32 y); + + SDL_Surface *surface; + vector charpos; + string characters; + uint height, lineHeight; + +public: + SFontPlus(); + SFontPlus(SDL_Surface *font); + SFontPlus(string font); + ~SFontPlus(); + + bool utf8Code(unsigned char c); + + void initFont(SDL_Surface *font, string characters = SFONTPLUS_CHARSET); + void initFont(string font, string characters = SFONTPLUS_CHARSET); + void freeFont(); + + void write(SDL_Surface *s, string text, int x, int y); + + uint getTextWidth(string text); + uint getHeight(); + uint getLineHeight(); +}; + +#endif /* SFONTPLUS_H */ diff --git a/src/sparsehash-1.6/AUTHORS b/src/sparsehash-1.6/AUTHORS new file mode 100644 index 0000000..ee92be8 --- /dev/null +++ b/src/sparsehash-1.6/AUTHORS @@ -0,0 +1,2 @@ +opensource@google.com + diff --git a/src/sparsehash-1.6/COPYING b/src/sparsehash-1.6/COPYING new file mode 100644 index 0000000..e4956cf --- /dev/null +++ b/src/sparsehash-1.6/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2005, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/sparsehash-1.6/ChangeLog b/src/sparsehash-1.6/ChangeLog new file mode 100644 index 0000000..789eb16 --- /dev/null +++ b/src/sparsehash-1.6/ChangeLog @@ -0,0 +1,182 @@ +Fri Jan 8 14:47:55 2010 Google Inc. + + * sparsehash: version 1.6 release + * New accessor methods for deleted_key, empty_key (sjackman) + * Use explicit hash functions in sparsehash tests (csilvers) + * BUGFIX: Cast resize to fix SUNWspro bug (csilvers) + * Check for sz overflow in min_size (csilvers) + * Speed up clear() for dense and sparse hashtables (jeff) + * Avoid shrinking in all cases when min-load is 0 (shaunj, csilvers) + * Improve densehashtable code for the deleted key (gpike) + * BUGFIX: Fix operator= when the 2 empty-keys differ (andreidam) + * BUGFIX: Fix ht copying when empty-key isn't set (andreidam) + * PORTING: Use TmpFile() instead of /tmp on MinGW (csilvers) + * PORTING: Use filenames that work with Stratus VOS. + +Tue May 12 14:16:38 2009 Google Inc. + + * sparsehash: version 1.5.2 release + * Fix compile error: not initializing set_key in all constructors + +Fri May 8 15:23:44 2009 Google Inc. + + * sparsehash: version 1.5.1 release + * Fix broken equal_range() for all the hash-classes (csilvers) + +Wed May 6 11:28:49 2009 Google Inc. + + * sparsehash: version 1.5 release + * Support the tr1 unordered_map (and unordered_set) API (csilvers) + * Store only key for delkey; reduces need for 0-arg c-tor (csilvers) + * Prefer unordered_map to hash_map for the timing test (csilvers) + * PORTING: update the resource use for 64-bit machines (csilvers) + * PORTING: fix MIN/MAX collisions by un-#including windows.h (csilvers) + * Updated autoconf version to 2.61 and libtool version to 1.5.26 + +Wed Jan 28 17:11:31 2009 Google Inc. + + * sparsehash: version 1.4 release + * Allow hashtables to be <32 buckets (csilvers) + * Fix initial-sizing bug: was sizing tables too small (csilvers) + * Add asserts that clients don't abuse deleted/empty key (csilvers) + * Improve determination of 32/64 bit for C code (csilvers) + * Small fix for doc files in rpm (csilvers) + +Thu Nov 6 15:06:09 2008 Google Inc. + + * sparsehash: version 1.3 release + * Add an interface to change the parameters for resizing (myl) + * Document another potentially good hash function (csilvers) + +Thu Sep 18 13:53:20 2008 Google Inc. + + * sparsehash: version 1.2 release + * Augment documentation to better describe namespace issues (csilvers) + * BUG FIX: replace hash<> with SPARSEHASH_HASH, for windows (csilvers) + * Add timing test to unittest to test repeated add+delete (csilvers) + * Do better picking a new size when resizing (csilvers) + * Use ::google instead of google as a namespace (csilvers) + * Improve threading test at config time (csilvers) + +Mon Feb 11 16:30:11 2008 Google Inc. + + * sparsehash: version 1.1 release + * Fix brown-paper-bag bug in some constructors (rafferty) + * Fix problem with variables shadowing member vars, add -Wshadow + +Thu Nov 29 11:44:38 2007 Google Inc. + + * sparsehash: version 1.0.2 release + * Fix a final reference to hash<> to use SPARSEHASH_HASH<> instead. + +Wed Nov 14 08:47:48 2007 Google Inc. + + * sparsehash: version 1.0.1 release :-( + * Remove an unnecessary (harmful) "#define hash" in windows' config.h + +Tue Nov 13 15:15:46 2007 Google Inc. + + * sparsehash: version 1.0 release! We are now out of beta. + * Clean up Makefile awk script to be more readable (csilvers) + * Namespace fixes: use fewer #defines, move typedefs into namespace + +Fri Oct 12 12:35:24 2007 Google Inc. + + * sparsehash: version 0.9.1 release + * Fix Makefile awk script to work on more architectures (csilvers) + * Add test to test code in more 'real life' situations (csilvers) + +Tue Oct 9 14:15:21 2007 Google Inc. + + * sparsehash: version 0.9 release + * More type-hygiene improvements, especially for 64-bit (csilvers) + * Some configure improvements to improve portability, utility (austern) + * Small bugfix for operator== for dense_hash_map (jeff) + +Tue Jul 3 12:55:04 2007 Google Inc. + + * sparsehash: version 0.8 release + * Minor type-hygiene improvements: size_t for int, etc. (csilvers) + * Porting improvements: tests pass on OS X, FreeBSD, Solaris (csilvers) + * Full windows port! VS solution provided for all unittests (csilvers) + +Mon Jun 11 11:33:41 2007 Google Inc. + + * sparsehash: version 0.7 release + * Syntax fixes to better support gcc 4.3 and VC++ 7 (mec, csilvers) + * Improved windows/VC++ support (see README.windows) (csilvers) + * Config improvements: better tcmalloc support and config.h (csilvers) + * More robust with missing hash_map + nix 'trampoline' .h's (csilvers) + * Support for STLport's hash_map/hash_fun locations (csilvers) + * Add .m4 files to distribution; now all source is there (csilvers) + * Tiny modification of shrink-threshhold to allow never-shrinking (amc) + * Protect timing tests against aggressive optimizers (csilvers) + * Extend time_hash_map to test bigger objects (csilvers) + * Extend type-trait support to work with const objects (csilvers) + * USER VISIBLE: speed up all code by replacing memmove with memcpy + (csilvers) + +Tue Mar 20 17:29:34 2007 Google Inc. + + * sparsehash: version 0.6 release + * Some improvement to type-traits (jyasskin) + * Better timing results when google-perftools is installed (sanjay) + * Updates and fixes to html documentation and README (csilvers) + * A bit more careful about #includes (csilvers) + * Fix for typo that broken compilation on some systems (csilvers) + * USER VISIBLE: New clear_no_resize() method added to dense_hash_map + (uszkoreit) + +Sat Oct 21 13:47:47 2006 Google Inc. + + * sparsehash: version 0.5 release + * Support uint16_t (SunOS) in addition to u_int16_t (BSD) (csilvers) + * Get rid of UNDERSTANDS_ITERATOR_TAGS; everyone understands (csilvers) + * Test that empty-key and deleted-key differ (rbayardo) + * Fix example docs: strcmp needs to test for NULL (csilvers) + +Sun Apr 23 22:42:35 2006 Google Inc. + + * sparsehash: version 0.4 release + * Remove POD requirement for keys and values! (austern) + * Add tr1-compatible type-traits system to speed up POD ops. (austern) + * Fixed const-iterator bug where postfix ++ didn't compile. (csilvers) + * Fixed iterator comparison bugs where <= was incorrect. (csilvers) + * Clean up config.h to keep its #defines from conflicting. (csilvers) + * Big documentation sweep and cleanup. (csilvers) + * Update documentation to talk more about good hash fns. (csilvers) + * Fixes to compile on MSVC (working around some MSVC bugs). (rennie) + * Avoid resizing hashtable on operator[] lookups (austern) + +Thu Nov 3 20:12:31 2005 Google Inc. + + * sparsehash: version 0.3 release + * Quiet compiler warnings on some compilers. (csilvers) + * Some documentation fixes: example code for dense_hash_map. (csilvers) + * Fix a bug where swap() wasn't swapping delete_key(). (csilvers) + * set_deleted_key() and set_empty_key() now take a key only, + allowing hash-map values to be forward-declared. (csilvers) + * support for std::insert_iterator (and std::inserter). (csilvers) + +Mon May 2 07:04:46 2005 Google Inc. + + * sparsehash: version 0.2 release + * Preliminary support for msvc++ compilation. (csilvers) + * Documentation fixes -- some example code was incomplete! (csilvers) + * Minimize size of config.h to avoid other-package conflicts (csilvers) + * Contribute a C-based version of sparsehash that served as the + inspiration for this code. One day, I hope to clean it up and + support it, but for now it's just in experimental/, for playing + around with. (csilvers) + * Change default namespace from std to google. (csilvers) + +Fri Jan 14 16:53:32 2005 Google Inc. + + * sparsehash: initial release: + The sparsehash package contains several hash-map implementations, + similar in API to SGI's hash_map class, but with different + performance characteristics. sparse_hash_map uses very little + space overhead: 1-2 bits per entry. dense_hash_map is typically + faster than the default SGI STL implementation. This package + also includes hash-set analogues of these classes. + diff --git a/src/sparsehash-1.6/INSTALL b/src/sparsehash-1.6/INSTALL new file mode 100644 index 0000000..23e5f25 --- /dev/null +++ b/src/sparsehash-1.6/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/src/sparsehash-1.6/Makefile.am b/src/sparsehash-1.6/Makefile.am new file mode 100644 index 0000000..783baa6 --- /dev/null +++ b/src/sparsehash-1.6/Makefile.am @@ -0,0 +1,157 @@ +## Process this file with automake to produce Makefile.in + +# Make sure that when we re-make ./configure, we get the macros we need +ACLOCAL_AMFLAGS = -I m4 + +# This is so we can #include +AM_CPPFLAGS = -I$(top_srcdir)/src + +# These are good warnings to turn on by default +if GCC +AM_CXXFLAGS = -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -Wshadow +endif + +googleincludedir = $(includedir)/google +## The .h files you want to install (that is, .h files that people +## who install this package can include in their own applications.) +googleinclude_HEADERS = \ + src/google/dense_hash_map \ + src/google/dense_hash_set \ + src/google/sparse_hash_map \ + src/google/sparse_hash_set \ + src/google/sparsetable \ + src/google/type_traits.h + +docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION) +## This is for HTML and other documentation you want to install. +## Add your documentation files (in doc/) in addition to these boilerplate +## Also add a TODO file if you have one +dist_doc_DATA = AUTHORS COPYING ChangeLog INSTALL NEWS README README.windows \ + TODO \ + doc/dense_hash_map.html \ + doc/dense_hash_set.html \ + doc/sparse_hash_map.html \ + doc/sparse_hash_set.html \ + doc/sparsetable.html \ + doc/implementation.html \ + doc/performance.html \ + doc/index.html \ + doc/designstyle.css + +## The libraries (.so's) you want to install +lib_LTLIBRARIES = +## The location of the windows project file for each binary we make +WINDOWS_PROJECTS = google-sparsehash.sln + +## unittests you want to run when people type 'make check'. +## TESTS is for binary unittests, check_SCRIPTS for script-based unittests. +## TESTS_ENVIRONMENT sets environment variables for when you run unittest, +## but it only seems to take effect for *binary* unittests (argh!) +TESTS = type_traits_unittest sparsetable_unittest hashtable_unittest \ + simple_test +# TODO(csilvers): get simple_test working on windows +WINDOWS_PROJECTS += vsprojects/type_traits_unittest/type_traits_unittest.vcproj \ + vsprojects/sparsetable_unittest/sparsetable_unittest.vcproj \ + vsprojects/hashtable_unittest/hashtable_unittest.vcproj +check_SCRIPTS = +TESTS_ENVIRONMENT = + +## This should always include $(TESTS), but may also include other +## binaries that you compile but don't want automatically installed. +noinst_PROGRAMS = $(TESTS) time_hash_map +WINDOWS_PROJECTS += vsprojects/time_hash_map/time_hash_map.vcproj + + +## vvvv RULES TO MAKE THE LIBRARIES, BINARIES, AND UNITTESTS + +# All our .h files need to read the config information in config.h. The +# autoheader config.h has too much info, including PACKAGENAME, that +# might conflict with other config.h's an application might #include. +# Thus, we create a "minimal" config.h, called sparseconfig.h, that +# includes only the #defines we really need, and that are unlikely to +# change from system to system. NOTE: The awk command is equivalent to +# fgrep -B2 -f- $(top_builddir)/src/config.h \ +# fgrep -vx -e -- > _sparsehash_config +# For correctness, it depends on the fact config.h.include does not have +# any lines starting with #. +src/google/sparsehash/sparseconfig.h: $(top_builddir)/src/config.h \ + $(top_srcdir)/src/config.h.include + [ -d $(@D) ] || mkdir -p $(@D) + echo "/*" > $(@D)/_sparsehash_config + echo " * NOTE: This file is for internal use only." >> $(@D)/_sparsehash_config + echo " * Do not use these #defines in your own program!" >> $(@D)/_sparsehash_config + echo " */" >> $(@D)/_sparsehash_config + $(AWK) '{prevline=currline; currline=$$0;} \ + /^#/ {in_second_file = 1;} \ + !in_second_file {if (currline !~ /^ *$$/) {inc[currline]=0}}; \ + in_second_file { for (i in inc) { \ + if (index(currline, i) != 0) { \ + print "\n"prevline"\n"currline; \ + delete inc[i]; \ + } \ + } }' \ + $(top_srcdir)/src/config.h.include $(top_builddir)/src/config.h \ + >> $(@D)/_sparsehash_config + mv -f $(@D)/_sparsehash_config $@ +# This is how we tell automake about auto-generated .h files +BUILT_SOURCES = src/google/sparsehash/sparseconfig.h +CLEANFILES = src/google/sparsehash/sparseconfig.h + +sparsehashincludedir = $(googleincludedir)/sparsehash +sparsehashinclude_HEADERS = \ + src/google/sparsehash/densehashtable.h \ + src/google/sparsehash/sparsehashtable.h +nodist_sparsehashinclude_HEADERS = src/google/sparsehash/sparseconfig.h + +type_traits_unittest_SOURCES = \ + src/type_traits_unittest.cc \ + $(sparsehashinclude_HEADERS) \ + src/google/type_traits.h +nodist_type_traits_unittest_SOURCES = $(nodist_sparsehashinclude_HEADERS) + +sparsetable_unittest_SOURCES = \ + src/sparsetable_unittest.cc \ + $(sparsehashinclude_HEADERS) \ + src/google/sparsetable +nodist_sparsetable_unittest_SOURCES = $(nodist_sparsehashinclude_HEADERS) + +hashtable_unittest_SOURCES = \ + src/hashtable_unittest.cc \ + $(googleinclude_HEADERS) \ + $(sparsehashinclude_HEADERS) \ + src/words +nodist_hashtable_unittest_SOURCES = $(nodist_sparsehashinclude_HEADERS) + +simple_test_SOURCES = \ + src/simple_test.cc \ + $(sparsehashinclude_HEADERS) +nodist_simple_test_SOURCES = $(nodist_sparsehashinclude_HEADERS) + +time_hash_map_SOURCES = \ + src/time_hash_map.cc \ + $(sparsehashinclude_HEADERS) \ + $(googleinclude_HEADERS) +nodist_time_hash_map_SOURCES = $(nodist_sparsehashinclude_HEADERS) + +# If tcmalloc is installed, use it with time_hash_map; it gives us +# heap-usage statistics for the hash_map routines, which is very nice +time_hash_map_CXXFLAGS = @tcmalloc_flags@ $(AM_CXXFLAGS) +time_hash_map_LDFLAGS = @tcmalloc_flags@ +time_hash_map_LDADD = @tcmalloc_libs@ + +## ^^^^ END OF RULES TO MAKE THE LIBRARIES, BINARIES, AND UNITTESTS + + +rpm: dist-gzip packages/rpm.sh packages/rpm/rpm.spec + @cd packages && ./rpm.sh ${PACKAGE} ${VERSION} + +deb: dist-gzip packages/deb.sh packages/deb/* + @cd packages && ./deb.sh ${PACKAGE} ${VERSION} + +# Windows wants write permission to .vcproj files and maybe even sln files. +dist-hook: + test -e "$(distdir)/vsprojects" \ + && chmod -R u+w $(distdir)/*.sln $(distdir)/vsprojects/ + +EXTRA_DIST = packages/rpm.sh packages/rpm/rpm.spec packages/deb.sh packages/deb \ + src/config.h.include src/windows $(WINDOWS_PROJECTS) experimental diff --git a/src/sparsehash-1.6/NEWS b/src/sparsehash-1.6/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/src/sparsehash-1.6/README b/src/sparsehash-1.6/README new file mode 100644 index 0000000..11df6ed --- /dev/null +++ b/src/sparsehash-1.6/README @@ -0,0 +1,149 @@ +This directory contains several hash-map implementations, similar in +API to SGI's hash_map class, but with different performance +characteristics. sparse_hash_map uses very little space overhead, 1-2 +bits per entry. dense_hash_map is very fast, particulary on lookup. +(sparse_hash_set and dense_hash_set are the set versions of these +routines.) On the other hand, these classes have requirements that +may not make them appropriate for all applications. + +All these implementation use a hashtable with internal quadratic +probing. This method is space-efficient -- there is no pointer +overhead -- and time-efficient for good hash functions. + +COMPILING +--------- +To compile test applications with these classes, run ./configure +followed by make. To install these header files on your system, run +'make install'. (On Windows, the instructions are different; see +README.windows.) See INSTALL for more details. + +This code should work on any modern C++ system. It has been tested on +Linux (Ubuntu, Fedora, RedHat, Debian), Solaris 10 x86, FreeBSD 6.0, +OS X 10.3 and 10.4, and Windows under both VC++7 and VC++8. + +USING +----- +See the html files in the doc directory for small example programs +that use these classes. It's enough to just include the header file: + + #include // or sparse_hash_set, dense_hash_map, ... + google::sparse_hash_set number_mapper; + +and use the class the way you would other hash-map implementations. +(Though see "API" below for caveats.) + +By default (you can change it via a flag to ./configure), these hash +implementations are defined in the google namespace. + +API +--- +The API for sparse_hash_map, dense_hash_map, sparse_hash_set, and +dense_hash_set, are a superset of the API of SGI's hash_map class. +See doc/sparse_hash_map.html, et al., for more information about the +API. + +The usage of these classes differ from SGI's hash_map, and other +hashtable implementations, in the following major ways: + +1) dense_hash_map requires you to set aside one key value as the + 'empty bucket' value, set via the set_empty_key() method. This + *MUST* be called before you can use the dense_hash_map. It is + illegal to insert any elements into a dense_hash_map whose key is + equal to the empty-key. + +2) For both dense_hash_map and sparse_hash_map, if you wish to delete + elements from the hashtable, you must set aside a key value as the + 'deleted bucket' value, set via the set_deleted_key() method. If + your hash-map is insert-only, there is no need to call this + method. If you call set_deleted_key(), it is illegal to insert any + elements into a dense_hash_map or sparse_hash_map whose key is + equal to the deleted-key. + +3) These hash-map implementation support I/O. See below. + +There are also some smaller differences: + +1) The constructor takes an optional argument that specifies the + number of elements you expect to insert into the hashtable. This + differs from SGI's hash_map implementation, which takes an optional + number of buckets. + +2) erase() does not immediately reclaim memory. As a consequence, + erase() does not invalidate any iterators, making loops like this + correct: + for (it = ht.begin(); it != ht.end(); ++it) + if (...) ht.erase(it); + As another consequence, a series of erase() calls can leave your + hashtable using more memory than it needs to. The hashtable will + automatically compact() at the next call to insert(), but to + manually compact a hashtable, you can call + ht.resize(0) + +3) While sparse_hash_map et al. accept an Allocator template argument, + they ignore it. They use malloc() and free() for all memory + allocations. + +4) sparse_hash_map et al. do not use exceptions. + +I/O +--- +In addition to the normal hash-map operations, sparse_hash_map can +read and write hashtables to disk. (dense_hash_map also has the API, +but it has not yet been implemented, and writes will always fail.) + +In the simplest case, writing a hashtable is as easy as calling two +methods on the hashtable: + ht.write_metadata(fp); + ht.write_nopointer_data(fp); + +Reading in this data is equally simple: + google::sparse_hash_map<...> ht; + ht.read_metadata(fp); + ht.read_nopointer_data(fp); + +The above is sufficient if the key and value do not contain any +pointers: they are basic C types or agglomorations of basic C types. +If the key and/or value do contain pointers, you can still store the +hashtable by replacing write_nopointer_data() with a custom writing +routine. See sparse_hash_map.html et al. for more information. + +SPARSETABLE +----------- +In addition to the hash-map and hash-set classes, this package also +provides sparsetable.h, an array implementation that uses space +proportional to the number of elements in the array, rather than the +maximum element index. It uses very little space overhead: 1 bit per +entry. See doc/sparsetable.html for the API. + +RESOURCE USAGE +-------------- +* sparse_hash_map has memory overhead of about 2 bits per hash-map + entry. +* dense_hash_map has a factor of 2-3 memory overhead: if your + hashtable data takes X bytes, dense_hash_map will use 3X-4X memory + total. + +Hashtables tend to double in size when resizing, creating an +additional 50% space overhead. dense_hash_map does in fact have a +significant "high water mark" memory use requirement. +sparse_hash_map, however, is written to need very little space +overhead when resizing: only a few bits per hashtable entry. + +PERFORMANCE +----------- +You can compile and run the included file time_hash_map.cc to examine +the performance of sparse_hash_map, dense_hash_map, and your native +hash_map implementation on your system. One test against the +SGI hash_map implementation gave the following timing information for +a simple find() call: + SGI hash_map: 22 ns + dense_hash_map: 13 ns + sparse_hash_map: 117 ns + SGI map: 113 ns + +See doc/performance.html for more detailed charts on resource usage +and performance data. + +--- +16 March 2005 +(Last updated: 20 March 2007) diff --git a/src/sparsehash-1.6/TODO b/src/sparsehash-1.6/TODO new file mode 100644 index 0000000..e9b0263 --- /dev/null +++ b/src/sparsehash-1.6/TODO @@ -0,0 +1,28 @@ +1) TODO: I/O implementation in densehashtable.h + +2) TODO: document SPARSEHASH_STAT_UPDATE macro, and also macros that + tweak performance. Perhaps add support to these to the API? + +3) TODO: support exceptions? + +4) BUG: sparsetable's operator[] doesn't work well with printf: you + need to explicitly cast the result to value_type to print it. (It + works fine with streams.) + +5) TODO: consider rewriting dense_hash_map to use a 'groups' scheme, + like sparsetable, but without the sparse-allocation within a + group. This makes resizing have better memory-use properties. The + downside is that probes across groups might take longer since + groups are not contiguous in memory. Making groups the same size + as a cache-line, and ensuring they're loaded on cache-line + boundaries, might help. Needs careful testing to make sure it + doesn't hurt performance. + +6) TODO: Get the C-only version of sparsehash in experimental/ ready + for prime-time. + +7) TODO: use cmake (www.cmake.org) to make it easy to isntall this on + a windows system. + +--- +28 February 2007 diff --git a/src/sparsehash-1.6/aclocal.m4 b/src/sparsehash-1.6/aclocal.m4 new file mode 100644 index 0000000..2bdc7db --- /dev/null +++ b/src/sparsehash-1.6/aclocal.m4 @@ -0,0 +1,868 @@ +# generated automatically by aclocal 1.9.6 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.9.6])]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 7 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. +# +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/acx_pthread.m4]) +m4_include([m4/google_namespace.m4]) +m4_include([m4/namespaces.m4]) +m4_include([m4/stl_hash.m4]) +m4_include([m4/stl_hash_fun.m4]) +m4_include([m4/stl_namespace.m4]) diff --git a/src/sparsehash-1.6/configure.ac b/src/sparsehash-1.6/configure.ac new file mode 100644 index 0000000..dea367c --- /dev/null +++ b/src/sparsehash-1.6/configure.ac @@ -0,0 +1,74 @@ +## Process this file with autoconf to produce configure. +## In general, the safest way to proceed is to run ./autogen.sh + +# make sure we're interpreted by some minimal autoconf +AC_PREREQ(2.57) + +AC_INIT(sparsehash, 1.6, opensource@google.com) +# The argument here is just something that should be in the current directory +# (for sanity checking) +AC_CONFIG_SRCDIR(README) +AM_INIT_AUTOMAKE([dist-zip]) +AM_CONFIG_HEADER(src/config.h) + +# Checks for programs. +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXX +AM_CONDITIONAL(GCC, test "$GCC" = yes) # let the Makefile know if we're gcc + +# Check whether some low-level functions/files are available +AC_HEADER_STDC +AC_CHECK_FUNCS(memcpy memmove) +AC_CHECK_TYPES([uint16_t]) # defined in C99 systems +AC_CHECK_TYPES([u_int16_t]) # defined in BSD-derived systems, and gnu +AC_CHECK_TYPES([__uint16]) # defined in some windows systems (vc7) +AC_CHECK_TYPES([long long]) # probably defined everywhere, but... + +# These are 'only' needed for unittests +AC_CHECK_HEADERS(sys/resource.h unistd.h sys/time.h sys/utsname.h) + +# If you have google-perftools installed, we can do a bit more testing. +# We not only want to set HAVE_MALLOC_EXTENSION_H, we also want to set +# a variable to let the Makefile to know to link in tcmalloc. +AC_LANG([C++]) +AC_CHECK_HEADERS(google/malloc_extension.h, + tcmalloc_libs=-ltcmalloc, + tcmalloc_libs=) +# On some systems, when linking in tcmalloc you also need to link in +# pthread. That's a bug somewhere, but we'll work around it for now. +tcmalloc_flags="" +if test -n "$tcmalloc_libs"; then + ACX_PTHREAD + tcmalloc_flags="\$(PTHREAD_CFLAGS)" + tcmalloc_libs="$tcmalloc_libs \$(PTHREAD_LIBS)" +fi +AC_SUBST(tcmalloc_flags) +AC_SUBST(tcmalloc_libs) + +# Figure out where hash_map lives and also hash_fun.h (or stl_hash_fun.h). +# This also tells us what namespace hash code lives in. +AC_CXX_STL_HASH +AC_CXX_STL_HASH_FUN + +# Find out what namespace 'normal' STL code lives in, and also what namespace +# the user wants our classes to be defined in +AC_CXX_STL_NAMESPACE +AC_DEFINE_GOOGLE_NAMESPACE(google) + +# In unix-based systems, hash is always defined as hash<> (in namespace. +# HASH_NAMESPACE.) So we can use a simple AC_DEFINE here. On +# windows, and possibly on future unix STL implementations, this +# macro will evaluate to something different.) +AC_DEFINE(SPARSEHASH_HASH_NO_NAMESPACE, hash, + [The system-provided hash function, in namespace HASH_NAMESPACE.]) + +# Do *not* define this in terms of SPARSEHASH_HASH_NO_NAMESPACE, because +# SPARSEHASH_HASH is exported to sparseconfig.h, but S_H_NO_NAMESPACE isn't. +AC_DEFINE(SPARSEHASH_HASH, HASH_NAMESPACE::hash, + [The system-provided hash function including the namespace.]) + + +# Write generated configuration file +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/src/sparsehash-1.6/doc/dense_hash_map.html b/src/sparsehash-1.6/doc/dense_hash_map.html new file mode 100644 index 0000000..eaef87e --- /dev/null +++ b/src/sparsehash-1.6/doc/dense_hash_map.html @@ -0,0 +1,1591 @@ + + + + + +dense_hash_map<Key, Data, HashFcn, EqualKey, Alloc> + + + + +

[Note: this document is formatted similarly to the SGI STL +implementation documentation pages, and refers to concepts and classes +defined there. However, neither this document nor the code it +describes is associated with SGI, nor is it necessary to have SGI's +STL implementation installed in order to use this class.]

+ + +

dense_hash_map<Key, Data, HashFcn, EqualKey, Alloc>

+ +

dense_hash_map is a Hashed +Associative Container that associates objects of type Key +with objects of type Data. dense_hash_map is a Pair +Associative Container, meaning that its value type is pair<const Key, Data>. It is also a +Unique +Associative Container, meaning that no two elements have keys that +compare equal using EqualKey.

+ +

Looking up an element in a dense_hash_map by its key is +efficient, so dense_hash_map is useful for "dictionaries" +where the order of elements is irrelevant. If it is important for the +elements to be in a particular order, however, then map is more appropriate.

+ +

dense_hash_map is distinguished from other hash-map +implementations by its speed and by the ability to save +and restore contents to disk. On the other hand, this hash-map +implementation can use significantly more space than other hash-map +implementations, and it also has requirements -- for instance, for a +distinguished "empty key" -- that may not be easy for all +applications to satisfy.

+ +

This class is appropriate for applications that need speedy access +to relatively small "dictionaries" stored in memory, or for +applications that need these dictionaries to be persistent. [implementation note])

+ + +

Example

+ +(Note: this example uses SGI semantics for hash<> +-- the kind used by gcc and most Unix compiler suites -- and not +Dinkumware semantics -- the kind used by Microsoft Visual Studio. If +you are using MSVC, this example will not compile as-is: you'll need +to change hash to hash_compare, and you +won't use eqstr at all. See the MSVC documentation for +hash_map and hash_compare, for more +details.) + +
+#include <iostream>
+#include <google/dense_hash_map>
+
+using google::dense_hash_map;      // namespace where class lives by default
+using std::cout;
+using std::endl;
+using ext::hash;  // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
+
+struct eqstr
+{
+  bool operator()(const char* s1, const char* s2) const
+  {
+    return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
+  }
+};
+
+int main()
+{
+  dense_hash_map<const char*, int, hash<const char*>, eqstr> months;
+  
+  months.set_empty_key(NULL);
+  months["january"] = 31;
+  months["february"] = 28;
+  months["march"] = 31;
+  months["april"] = 30;
+  months["may"] = 31;
+  months["june"] = 30;
+  months["july"] = 31;
+  months["august"] = 31;
+  months["september"] = 30;
+  months["october"] = 31;
+  months["november"] = 30;
+  months["december"] = 31;
+  
+  cout << "september -> " << months["september"] << endl;
+  cout << "april     -> " << months["april"] << endl;
+  cout << "june      -> " << months["june"] << endl;
+  cout << "november  -> " << months["november"] << endl;
+}
+
+ + +

Definition

+ +Defined in the header dense_hash_map. +This class is not part of the C++ standard, though it is mostly +compatible with the tr1 class unordered_map. + + +

Template parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
+ Key + + The hash_map's key type. This is also defined as + dense_hash_map::key_type. + +   +
+ Data + + The hash_map's data type. This is also defined as + dense_hash_map::data_type. [7] + +   +
+ HashFcn + + The hash function used by the + hash_map. This is also defined as dense_hash_map::hasher. +
Note: Hashtable performance depends heavliy on the choice of + hash function. See the performance + page for more information. +
+ hash<Key> +
+ EqualKey + + The hash_map key equality function: a binary predicate that determines + whether two keys are equal. This is also defined as + dense_hash_map::key_equal. + + equal_to<Key> +
+ Alloc + + Ignored; this is included only for API-compatibility + with SGI's (and tr1's) STL implementation. + +
+ + +

Model of

+ +Unique Hashed Associative Container, +Pair Associative Container + + +

Type requirements

+ +
    +
  • +Key is Assignable. +
  • +EqualKey is a Binary Predicate whose argument type is Key. +
  • +EqualKey is an equivalence relation. +
  • +Alloc is an Allocator. +
+ + +

Public base classes

+ +None. + + +

Members

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberWhere definedDescription
+ key_type + + Associative + Container + + The dense_hash_map's key type, Key. +
+ data_type + + Pair + Associative Container + + The type of object associated with the keys. +
+ value_type + + Pair + Associative Container + + The type of object, pair<const key_type, data_type>, + stored in the hash_map. +
+ hasher + + Hashed + Associative Container + + The dense_hash_map's hash + function. +
+ key_equal + + Hashed + Associative Container + + Function + object that compares keys for equality. +
+ allocator_type + + Unordered Associative Container (tr1) + + The type of the Allocator given as a template parameter. +
+ pointer + + Container + + Pointer to T. +
+ reference + + Container + + Reference to T +
+ const_reference + + Container + + Const reference to T +
+ size_type + + Container + + An unsigned integral type. +
+ difference_type + + Container + + A signed integral type. +
+ iterator + + Container + + Iterator used to iterate through a dense_hash_map. [1] +
+ const_iterator + + Container + + Const iterator used to iterate through a dense_hash_map. +
+ local_iterator + + Unordered Associative Container (tr1) + + Iterator used to iterate through a subset of + dense_hash_map. [1] +
+ const_local_iterator + + Unordered Associative Container (tr1) + + Const iterator used to iterate through a subset of + dense_hash_map. +
+ iterator begin() + + Container + + Returns an iterator pointing to the beginning of the + dense_hash_map. +
+ iterator end() + + Container + + Returns an iterator pointing to the end of the + dense_hash_map. +
+ const_iterator begin() const + + Container + + Returns an const_iterator pointing to the beginning of the + dense_hash_map. +
+ const_iterator end() const + + Container + + Returns an const_iterator pointing to the end of the + dense_hash_map. +
+ local_iterator begin(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the beginning of bucket + i in the dense_hash_map. +
+ local_iterator end(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the end of bucket + i in the dense_hash_map. For + dense_hash_map, each bucket contains either 0 or 1 item. +
+ const_local_iterator begin(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the beginning of bucket + i in the dense_hash_map. +
+ const_local_iterator end(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the end of bucket + i in the dense_hash_map. For + dense_hash_map, each bucket contains either 0 or 1 item. +
+ size_type size() const + + Container + + Returns the size of the dense_hash_map. +
+ size_type max_size() const + + Container + + Returns the largest possible size of the dense_hash_map. +
+ bool empty() const + + Container + + true if the dense_hash_map's size is 0. +
+ size_type bucket_count() const + + Hashed + Associative Container + + Returns the number of buckets used by the dense_hash_map. +
+ size_type max_bucket_count() const + + Hashed + Associative Container + + Returns the largest possible number of buckets used by the dense_hash_map. +
+ size_type bucket_size(size_type i) const + + Unordered Associative Container (tr1) + + Returns the number of elements in bucket i. For + dense_hash_map, this will be either 0 or 1. +
+ size_type bucket(const key_type& key) const + + Unordered Associative Container (tr1) + + If the key exists in the map, returns the index of the bucket + containing the given key, otherwise, return the bucket the key + would be inserted into. + This value may be passed to begin(size_type) and + end(size_type). +
+ float load_factor() const + + Unordered Associative Container (tr1) + + The number of elements in the dense_hash_map divided by + the number of buckets. +
+ float max_load_factor() const + + Unordered Associative Container (tr1) + + The maximum load factor before increasing the number of buckets in + the dense_hash_map. +
+ void max_load_factor(float new_grow) + + Unordered Associative Container (tr1) + + Sets the maximum load factor before increasing the number of + buckets in the dense_hash_map. +
+ float min_load_factor() const + + dense_hash_map + + The minimum load factor before decreasing the number of buckets in + the dense_hash_map. +
+ void min_load_factor(float new_grow) + + dense_hash_map + + Sets the minimum load factor before decreasing the number of + buckets in the dense_hash_map. +
+ void set_resizing_parameters(float shrink, float grow) + + dense_hash_map + + DEPRECATED. See below. +
+ void resize(size_type n) + + Hashed + Associative Container + + Increases the bucket count to hold at least n items. + [4] [5] +
+ void rehash(size_type n) + + Unordered Associative Container (tr1) + + Increases the bucket count to hold at least n items. + This is identical to resize. + [4] [5] +
+ hasher hash_funct() const + + Hashed + Associative Container + + Returns the hasher object used by the dense_hash_map. +
+ hasher hash_function() const + + Unordered Associative Container (tr1) + + Returns the hasher object used by the dense_hash_map. + This is idential to hash_funct. +
+ key_equal key_eq() const + + Hashed + Associative Container + + Returns the key_equal object used by the + dense_hash_map. +
+ dense_hash_map() + + Container + + Creates an empty dense_hash_map. +
+ dense_hash_map(size_type n) + + Hashed + Associative Container + + Creates an empty dense_hash_map that's optimized for holding + up to n items. + [5] +
+ dense_hash_map(size_type n, const hasher& h) + + Hashed + Associative Container + + Creates an empty dense_hash_map that's optimized for up + to n items, using h as the hash function. +
+ dense_hash_map(size_type n, const hasher& h, const + key_equal& k) + + Hashed + Associative Container + + Creates an empty dense_hash_map that's optimized for up + to n items, using h as the hash function and + k as the key equal function. +
+
template <class InputIterator>
+dense_hash_map(InputIterator f, InputIterator l) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a dense_hash_map with a copy of a range. +
+
template <class InputIterator>
+dense_hash_map(InputIterator f, InputIterator l, size_type n) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized to + hold up to n items. +
+
template <class InputIterator>
+dense_hash_map(InputIterator f, InputIterator l, size_type n, const
+hasher& h) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized to hold + up to n items, using h as the hash function. +
+
template <class InputIterator>
+dense_hash_map(InputIterator f, InputIterator l, size_type n, const
+hasher& h, const key_equal& k) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized for + holding up to n items, using h as the hash + function and k as the key equal function. +
+ dense_hash_map(const hash_map&) + + Container + + The copy constructor. +
+ dense_hash_map& operator=(const hash_map&) + + Container + + The assignment operator +
+ void swap(hash_map&) + + Container + + Swaps the contents of two hash_maps. +
+
pair<iterator, bool> insert(const value_type& x)
+
+
+ Unique + Associative Container + + Inserts x into the dense_hash_map. +
+
template <class InputIterator>
+void insert(InputIterator f, InputIterator l) 
[2] +
+ Unique + Associative Container + + Inserts a range into the dense_hash_map. +
+ void set_empty_key(const key_type& key) [6] + + dense_hash_map + + See below. +
+ void set_deleted_key(const key_type& key) [6] + + dense_hash_map + + See below. +
+ void clear_deleted_key() [6] + + dense_hash_map + + See below. +
+ void erase(iterator pos) + + Associative + Container + + Erases the element pointed to by pos. + [6] +
+ size_type erase(const key_type& k) + + Associative + Container + + Erases the element whose key is k. + [6] +
+ void erase(iterator first, iterator last) + + Associative + Container + + Erases all elements in a range. + [6] +
+ void clear() + + Associative + Container + + Erases all of the elements. +
+ void clear_no_resize() + + dense_hash_map + + See below. +
+ const_iterator find(const key_type& k) const + + Associative + Container + + Finds an element whose key is k. +
+ iterator find(const key_type& k) + + Associative + Container + + Finds an element whose key is k. +
+ size_type count(const key_type& k) const + + Unique + Associative Container + + Counts the number of elements whose key is k. +
+
pair<const_iterator, const_iterator> equal_range(const
+key_type& k) const 
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+
pair<iterator, iterator> equal_range(const
+key_type& k) 
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+
data_type& operator[](const key_type& k) [3] 
+
+ dense_hash_map + + See below. +
+ bool write_metadata(FILE *fp) + + dense_hash_map + + See below. +
+ bool read_metadata(FILE *fp) + + dense_hash_map + + See below. +
+ bool write_nopointer_data(FILE *fp) + + dense_hash_map + + See below. +
+ bool read_nopointer_data(FILE *fp) + + dense_hash_map + + See below. +
+
bool operator==(const hash_map&, const hash_map&)
+
+
+ Hashed + Associative Container + + Tests two hash_maps for equality. This is a global function, not a + member function. +
+ + +

New members

+ +These members are not defined in the Unique +Hashed Associative Container, Pair +Associative Container, or tr1's +Unordered Associative +Container requirements, but are specific to +dense_hash_map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDescription
+ void set_empty_key(const key_type& key) + + Sets the distinguished "empty" key to key. This must be + called immediately after construct time, before calls to another + other dense_hash_map operation. [6] +
+ void set_deleted_key(const key_type& key) + + Sets the distinguished "deleted" key to key. This must be + called before any calls to erase(). [6] +
+ void clear_deleted_key() + + Clears the distinguished "deleted" key. After this is called, + calls to erase() are not valid on this object. + [6] +
+ void clear_no_resize() + + Clears the hashtable like clear() does, but does not + recover the memory used for hashtable buckets. (The memory + used by the items in the hashtable is still recovered.) + This can save time for applications that want to reuse a + dense_hash_map many times, each time with a similar number + of objects. +
+
+data_type& 
+operator[](const key_type& k) [3]
+
+
+ Returns a reference to the object that is associated with + a particular key. If the dense_hash_map does not already + contain such an object, operator[] inserts the default + object data_type(). [3] +
+ void set_resizing_parameters(float shrink, float grow) + + This function is DEPRECATED. It is equivalent to calling + min_load_factor(shrink); max_load_factor(grow). +
+ bool write_metadata(FILE *fp) + + Write hashtable metadata to fp. See below. +
+ bool read_metadata(FILE *fp) + + Read hashtable metadata from fp. See below. +
+ bool write_nopointer_data(FILE *fp) + + Write hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ bool read_nopointer_data(FILE *fp) + + Read hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ + +

Notes

+ +

[1] + +dense_hash_map::iterator is not a mutable iterator, because +dense_hash_map::value_type is not Assignable. +That is, if i is of type dense_hash_map::iterator +and p is of type dense_hash_map::value_type, then +*i = p is not a valid expression. However, +dense_hash_map::iterator isn't a constant iterator either, +because it can be used to modify the object that it points to. Using +the same notation as above, (*i).second = p is a valid +expression.

+ +

[2] + +This member function relies on member template functions, which +may not be supported by all compilers. If your compiler supports +member templates, you can call this function with any type of input +iterator. If your compiler does not yet support member templates, +though, then the arguments must either be of type const +value_type* or of type dense_hash_map::const_iterator.

+ +

[3] + +Since operator[] might insert a new element into the +dense_hash_map, it can't possibly be a const member +function. Note that the definition of operator[] is +extremely simple: m[k] is equivalent to +(*((m.insert(value_type(k, data_type()))).first)).second. +Strictly speaking, this member function is unnecessary: it exists only +for convenience.

+ +

[4] + +In order to preserve iterators, erasing hashtable elements does not +cause a hashtable to resize. This means that after a string of +erase() calls, the hashtable will use more space than is +required. At a cost of invalidating all current iterators, you can +call resize() to manually compact the hashtable. The +hashtable promotes too-small resize() arguments to the +smallest legal value, so to compact a hashtable, it's sufficient to +call resize(0).

+ +

[5] + +Unlike some other hashtable implementations, the optional n in +the calls to the constructor, resize, and rehash +indicates not the desired number of buckets that +should be allocated, but instead the expected number of items to be +inserted. The class then sizes the hash-map appropriately for the +number of items specified. It's not an error to actually insert more +or fewer items into the hashtable, but the implementation is most +efficient -- does the fewest hashtable resizes -- if the number of +inserted items is n or slightly less.

+ +

[6] + +dense_hash_map requires you call +set_empty_key() immediately after constructing the hash-map, +and before calling any other dense_hash_map method. (This is +the largest difference between the dense_hash_map API and +other hash-map APIs. See implementation.html +for why this is necessary.) +The argument to set_empty_key() should be a key-value that +is never used for legitimate hash-map entries. If you have no such +key value, you will be unable to use dense_hash_map. It is +an error to call insert() with an item whose key is the +"empty key."

+ +dense_hash_map also requires you call +set_deleted_key() before calling erase(). +The argument to set_deleted_key() should be a key-value that +is never used for legitimate hash-map entries. It must be different +from the key-value used for set_empty_key(). It is an error to call +erase() without first calling set_deleted_key(), and +it is also an error to call insert() with an item whose key +is the "deleted key."

+ +

There is no need to call set_deleted_key if you do not +wish to call erase() on the hash-map.

+ +

It is acceptable to change the deleted-key at any time by calling +set_deleted_key() with a new argument. You can also call +clear_deleted_key(), at which point all keys become valid for +insertion but no hashtable entries can be deleted until +set_deleted_key() is called again.

+ +

[7] + +dense_hash_map requires that data_type has a +zero-argument default constructor. This is because +dense_hash_map uses the special value pair(empty_key, +data_type()) to denote empty buckets, and thus needs to be able +to create data_type using a zero-argument constructor.

+ +

If your data_type does not have a zero-argument default +constructor, there are several workarounds:

+
    +
  • Store a pointer to data_type in the map, instead of + data_type directly. This may yield faster code as + well, since hashtable-resizes will just have to move pointers + around, rather than copying the entire data_type. +
  • Add a zero-argument default constructor to data_type. +
  • Subclass data_type and add a zero-argument default + constructor to the subclass. +
+ + +

Input/Output

+ +
+

IMPORTANT IMPLEMENTATION NOTE: In the current version of +this code, the input/output routines for dense_hash_map have +not yet been implemented. This section explains the API, but +note that all calls to these routines will fail (return +false). It is a TODO to remedy this situation.

+
+ +

It is possible to save and restore dense_hash_map objects +to disk. Storage takes place in two steps. The first writes the +hashtable metadata. The second writes the actual data.

+ +

To write a hashtable to disk, first call write_metadata() +on an open file pointer. This saves the hashtable information in a +byte-order-independent format.

+ +

After the metadata has been written to disk, you must write the +actual data stored in the hash-map to disk. If both the key and data +are "simple" enough, you can do this by calling +write_nopointer_data(). "Simple" data is data that can be +safely copied to disk via fwrite(). Native C data types fall +into this category, as do structs of native C data types. Pointers +and STL objects do not.

+ +

Note that write_nopointer_data() does not do any endian +conversion. Thus, it is only appropriate when you intend to read the +data on the same endian architecture as you write the data.

+ +

If you cannot use write_nopointer_data() for any reason, +you can write the data yourself by iterating over the +dense_hash_map with a const_iterator and writing +the key and data in any manner you wish.

+ +

To read the hashtable information from disk, first you must create +a dense_hash_map object. Then open a file pointer to point +to the saved hashtable, and call read_metadata(). If you +saved the data via write_nopointer_data(), you can follow the +read_metadata() call with a call to +read_nopointer_data(). This is all that is needed.

+ +

If you saved the data through a custom write routine, you must call +a custom read routine to read in the data. To do this, iterate over +the dense_hash_map with an iterator; this operation +is sensical because the metadata has already been set up. For each +iterator item, you can read the key and value from disk, and set it +appropriately. You will need to do a const_cast on the +iterator, since it->first is always const. You +will also need to use placement-new if the key or value is a C++ +object. The code might look like this:

+
+   for (dense_hash_map<int*, ComplicatedClass>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       // The key is stored in the dense_hash_map as a pointer
+       const_cast<int*>(it->first) = new int;
+       fread(const_cast<int*>(it->first), sizeof(int), 1, fp);
+       // The value is a complicated C++ class that takes an int to construct
+       int ctor_arg;
+       fread(&ctor_arg, sizeof(int), 1, fp);
+       new (&it->second) ComplicatedClass(ctor_arg);  // "placement new"
+   }
+
+ + +

Validity of Iterators

+ +

erase() is guaranteed not to invalidate any iterators -- +except for any iterators pointing to the item being erased, of course. +insert() invalidates all iterators, as does +resize().

+ +

This is implemented by making erase() not resize the +hashtable. If you desire maximum space efficiency, you can call +resize(0) after a string of erase() calls, to force +the hashtable to resize to the smallest possible size.

+ +

In addition to invalidating iterators, insert() +and resize() invalidate all pointers into the hashtable. If +you want to store a pointer to an object held in a dense_hash_map, +either do so after finishing hashtable inserts, or store the object on +the heap and a pointer to it in the dense_hash_map.

+ + +

See also

+ +

The following are SGI STL, and some Google STL, concepts and +classes related to dense_hash_map.

+ +hash_map, +Associative Container, +Hashed Associative Container, +Pair Associative Container, +Unique Hashed Associative Container, +set, +map +multiset, +multimap, +hash_set, +hash_multiset, +hash_multimap, +sparse_hash_map, +sparse_hash_set, +dense_hash_set + + + diff --git a/src/sparsehash-1.6/doc/dense_hash_set.html b/src/sparsehash-1.6/doc/dense_hash_set.html new file mode 100644 index 0000000..2a5ff2e --- /dev/null +++ b/src/sparsehash-1.6/doc/dense_hash_set.html @@ -0,0 +1,1445 @@ + + + + + +dense_hash_set<Key, HashFcn, EqualKey, Alloc> + + + + +

[Note: this document is formatted similarly to the SGI STL +implementation documentation pages, and refers to concepts and classes +defined there. However, neither this document nor the code it +describes is associated with SGI, nor is it necessary to have SGI's +STL implementation installed in order to use this class.]

+ + +

dense_hash_set<Key, HashFcn, EqualKey, Alloc>

+ +

dense_hash_set is a Hashed +Associative Container that stores objects of type Key. +dense_hash_set is a Simple +Associative Container, meaning that its value type, as well as its +key type, is key. It is also a +Unique +Associative Container, meaning that no two elements have keys that +compare equal using EqualKey.

+ +

Looking up an element in a dense_hash_set by its key is +efficient, so dense_hash_set is useful for "dictionaries" +where the order of elements is irrelevant. If it is important for the +elements to be in a particular order, however, then map is more appropriate.

+ +

dense_hash_set is distinguished from other hash-set +implementations by its speed and by the ability to save +and restore contents to disk. On the other hand, this hash-set +implementation can use significantly more space than other hash-set +implementations, and it also has requirements -- for instance, for a +distinguished "empty key" -- that may not be easy for all +applications to satisfy.

+ +

This class is appropriate for applications that need speedy access +to relatively small "dictionaries" stored in memory, or for +applications that need these dictionaries to be persistent. [implementation note])

+ + +

Example

+ +(Note: this example uses SGI semantics for hash<> +-- the kind used by gcc and most Unix compiler suites -- and not +Dinkumware semantics -- the kind used by Microsoft Visual Studio. If +you are using MSVC, this example will not compile as-is: you'll need +to change hash to hash_compare, and you +won't use eqstr at all. See the MSVC documentation for +hash_map and hash_compare, for more +details.) + +
+#include <iostream>
+#include <google/dense_hash_set>
+
+using google::dense_hash_set;      // namespace where class lives by default
+using std::cout;
+using std::endl;
+using ext::hash;  // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
+
+struct eqstr
+{
+  bool operator()(const char* s1, const char* s2) const
+  {
+    return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
+  }
+};
+
+void lookup(const hash_set<const char*, hash<const char*>, eqstr>& Set,
+            const char* word)
+{
+  dense_hash_set<const char*, hash<const char*>, eqstr>::const_iterator it
+    = Set.find(word);
+  cout << word << ": "
+       << (it != Set.end() ? "present" : "not present")
+       << endl;
+}
+
+int main()
+{
+  dense_hash_set<const char*, hash<const char*>, eqstr> Set;
+  Set.set_empty_key(NULL);
+  Set.insert("kiwi");
+  Set.insert("plum");
+  Set.insert("apple");
+  Set.insert("mango");
+  Set.insert("apricot");
+  Set.insert("banana");
+
+  lookup(Set, "mango");
+  lookup(Set, "apple");
+  lookup(Set, "durian");
+}
+
+ + +

Definition

+ +Defined in the header dense_hash_set. +This class is not part of the C++ standard, though it is mostly +compatible with the tr1 class unordered_set. + + +

Template parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
+ Key + + The hash_set's key and value type. This is also defined as + dense_hash_set::key_type and + dense_hash_set::value_type. + +   +
+ HashFcn + + The hash function used by the + hash_set. This is also defined as dense_hash_set::hasher. +
Note: Hashtable performance depends heavliy on the choice of + hash function. See the performance + page for more information. +
+ hash<Key> +
+ EqualKey + + The hash_set key equality function: a binary predicate that determines + whether two keys are equal. This is also defined as + dense_hash_set::key_equal. + + equal_to<Key> +
+ Alloc + + Ignored; this is included only for API-compatibility + with SGI's (and tr1's) STL implementation. + +
+ + +

Model of

+ +Unique Hashed Associative Container, +Simple Associative Container + + +

Type requirements

+ +
    +
  • +Key is Assignable. +
  • +EqualKey is a Binary Predicate whose argument type is Key. +
  • +EqualKey is an equivalence relation. +
  • +Alloc is an Allocator. +
+ + +

Public base classes

+ +None. + + +

Members

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberWhere definedDescription
+ value_type + + Container + + The type of object, T, stored in the hash_set. +
+ key_type + + Associative + Container + + The key type associated with value_type. +
+ hasher + + Hashed + Associative Container + + The dense_hash_set's hash + function. +
+ key_equal + + Hashed + Associative Container + + Function + object that compares keys for equality. +
+ allocator_type + + Unordered Associative Container (tr1) + + The type of the Allocator given as a template parameter. +
+ pointer + + Container + + Pointer to T. +
+ reference + + Container + + Reference to T +
+ const_reference + + Container + + Const reference to T +
+ size_type + + Container + + An unsigned integral type. +
+ difference_type + + Container + + A signed integral type. +
+ iterator + + Container + + Iterator used to iterate through a dense_hash_set. +
+ const_iterator + + Container + + Const iterator used to iterate through a dense_hash_set. + (iterator and const_iterator are the same type.) +
+ local_iterator + + Unordered Associative Container (tr1) + + Iterator used to iterate through a subset of + dense_hash_set. +
+ const_local_iterator + + Unordered Associative Container (tr1) + + Const iterator used to iterate through a subset of + dense_hash_set. +
+ iterator begin() const + + Container + + Returns an iterator pointing to the beginning of the + dense_hash_set. +
+ iterator end() const + + Container + + Returns an iterator pointing to the end of the + dense_hash_set. +
+ local_iterator begin(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the beginning of bucket + i in the dense_hash_set. +
+ local_iterator end(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the end of bucket + i in the dense_hash_set. For + dense_hash_set, each bucket contains either 0 or 1 item. +
+ const_local_iterator begin(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the beginning of bucket + i in the dense_hash_set. +
+ const_local_iterator end(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the end of bucket + i in the dense_hash_set. For + dense_hash_set, each bucket contains either 0 or 1 item. +
+ size_type size() const + + Container + + Returns the size of the dense_hash_set. +
+ size_type max_size() const + + Container + + Returns the largest possible size of the dense_hash_set. +
+ bool empty() const + + Container + + true if the dense_hash_set's size is 0. +
+ size_type bucket_count() const + + Hashed + Associative Container + + Returns the number of buckets used by the dense_hash_set. +
+ size_type max_bucket_count() const + + Hashed + Associative Container + + Returns the largest possible number of buckets used by the dense_hash_set. +
+ size_type bucket_size(size_type i) const + + Unordered Associative Container (tr1) + + Returns the number of elements in bucket i. For + dense_hash_set, this will be either 0 or 1. +
+ size_type bucket(const key_type& key) const + + Unordered Associative Container (tr1) + + If the key exists in the map, returns the index of the bucket + containing the given key, otherwise, return the bucket the key + would be inserted into. + This value may be passed to begin(size_type) and + end(size_type). +
+ float load_factor() const + + Unordered Associative Container (tr1) + + The number of elements in the dense_hash_set divided by + the number of buckets. +
+ float max_load_factor() const + + Unordered Associative Container (tr1) + + The maximum load factor before increasing the number of buckets in + the dense_hash_set. +
+ void max_load_factor(float new_grow) + + Unordered Associative Container (tr1) + + Sets the maximum load factor before increasing the number of + buckets in the dense_hash_set. +
+ float min_load_factor() const + + dense_hash_set + + The minimum load factor before decreasing the number of buckets in + the dense_hash_set. +
+ void min_load_factor(float new_grow) + + dense_hash_set + + Sets the minimum load factor before decreasing the number of + buckets in the dense_hash_set. +
+ void set_resizing_parameters(float shrink, float grow) + + dense_hash_set + + DEPRECATED. See below. +
+ void resize(size_type n) + + Hashed + Associative Container + + Increases the bucket count to hold at least n items. + [2] [3] +
+ void rehash(size_type n) + + Unordered Associative Container (tr1) + + Increases the bucket count to hold at least n items. + This is identical to resize. + [2] [3] +
+ hasher hash_funct() const + + Hashed + Associative Container + + Returns the hasher object used by the dense_hash_set. +
+ hasher hash_function() const + + Unordered Associative Container (tr1) + + Returns the hasher object used by the dense_hash_set. + This is idential to hash_funct. +
+ key_equal key_eq() const + + Hashed + Associative Container + + Returns the key_equal object used by the + dense_hash_set. +
+ dense_hash_set() + + Container + + Creates an empty dense_hash_set. +
+ dense_hash_set(size_type n) + + Hashed + Associative Container + + Creates an empty dense_hash_set that's optimized for holding + up to n items. + [3] +
+ dense_hash_set(size_type n, const hasher& h) + + Hashed + Associative Container + + Creates an empty dense_hash_set that's optimized for up + to n items, using h as the hash function. +
+ dense_hash_set(size_type n, const hasher& h, const + key_equal& k) + + Hashed + Associative Container + + Creates an empty dense_hash_set that's optimized for up + to n items, using h as the hash function and + k as the key equal function. +
+
template <class InputIterator>
+dense_hash_set(InputIterator f, InputIterator l) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a dense_hash_set with a copy of a range. +
+
template <class InputIterator>
+dense_hash_set(InputIterator f, InputIterator l, size_type n) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized to + hold up to n items. +
+
template <class InputIterator>
+dense_hash_set(InputIterator f, InputIterator l, size_type n, const
+hasher& h) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized to hold + up to n items, using h as the hash function. +
+
template <class InputIterator>
+dense_hash_set(InputIterator f, InputIterator l, size_type n, const
+hasher& h, const key_equal& k) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized for + holding up to n items, using h as the hash + function and k as the key equal function. +
+ dense_hash_set(const hash_set&) + + Container + + The copy constructor. +
+ dense_hash_set& operator=(const hash_set&) + + Container + + The assignment operator +
+ void swap(hash_set&) + + Container + + Swaps the contents of two hash_sets. +
+
pair<iterator, bool> insert(const value_type& x)
+
+
+ Unique + Associative Container + + Inserts x into the dense_hash_set. +
+
template <class InputIterator>
+void insert(InputIterator f, InputIterator l) 
[2] +
+ Unique + Associative Container + + Inserts a range into the dense_hash_set. +
+ void set_empty_key(const key_type& key) [4] + + dense_hash_set + + See below. +
+ void set_deleted_key(const key_type& key) [4] + + dense_hash_set + + See below. +
+ void clear_deleted_key() [4] + + dense_hash_set + + See below. +
+ void erase(iterator pos) + + Associative + Container + + Erases the element pointed to by pos. + [4] +
+ size_type erase(const key_type& k) + + Associative + Container + + Erases the element whose key is k. + [4] +
+ void erase(iterator first, iterator last) + + Associative + Container + + Erases all elements in a range. + [4] +
+ void clear() + + Associative + Container + + Erases all of the elements. +
+ void clear_no_resize() + + dense_hash_map + + See below. +
+ iterator find(const key_type& k) const + + Associative + Container + + Finds an element whose key is k. +
+ size_type count(const key_type& k) const + + Unique + Associative Container + + Counts the number of elements whose key is k. +
+
pair<iterator, iterator> equal_range(const
+key_type& k) const
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+ bool write_metadata(FILE *fp) + + dense_hash_set + + See below. +
+ bool read_metadata(FILE *fp) + + dense_hash_set + + See below. +
+ bool write_nopointer_data(FILE *fp) + + dense_hash_set + + See below. +
+ bool read_nopointer_data(FILE *fp) + + dense_hash_set + + See below. +
+
bool operator==(const hash_set&, const hash_set&)
+
+
+ Hashed + Associative Container + + Tests two hash_sets for equality. This is a global function, not a + member function. +
+ + +

New members

+ +These members are not defined in the Unique +Hashed Associative Container, Simple +Associative Container, or tr1's Unordered Associative +Container requirements, but are specific to +dense_hash_set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDescription
+ void set_empty_key(const key_type& key) + + Sets the distinguished "empty" key to key. This must be + called immediately after construct time, before calls to another + other dense_hash_set operation. [4] +
+ void set_deleted_key(const key_type& key) + + Sets the distinguished "deleted" key to key. This must be + called before any calls to erase(). [4] +
+ void clear_deleted_key() + + Clears the distinguished "deleted" key. After this is called, + calls to erase() are not valid on this object. + [4] +
+ void clear_no_resize() + + Clears the hashtable like clear() does, but does not + recover the memory used for hashtable buckets. (The memory + used by the items in the hashtable is still recovered.) + This can save time for applications that want to reuse a + dense_hash_set many times, each time with a similar number + of objects. +
+ void set_resizing_parameters(float shrink, float grow) + + This function is DEPRECATED. It is equivalent to calling + min_load_factor(shrink); max_load_factor(grow). +
+ bool write_metadata(FILE *fp) + + Write hashtable metadata to fp. See below. +
+ bool read_metadata(FILE *fp) + + Read hashtable metadata from fp. See below. +
+ bool write_nopointer_data(FILE *fp) + + Write hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ bool read_nopointer_data(FILE *fp) + + Read hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ + +

Notes

+ +

[1] + +This member function relies on member template functions, which +may not be supported by all compilers. If your compiler supports +member templates, you can call this function with any type of input +iterator. If your compiler does not yet support member templates, +though, then the arguments must either be of type const +value_type* or of type dense_hash_set::const_iterator.

+ +

[2] + +In order to preserve iterators, erasing hashtable elements does not +cause a hashtable to resize. This means that after a string of +erase() calls, the hashtable will use more space than is +required. At a cost of invalidating all current iterators, you can +call resize() to manually compact the hashtable. The +hashtable promotes too-small resize() arguments to the +smallest legal value, so to compact a hashtable, it's sufficient to +call resize(0). + +

[3] + +Unlike some other hashtable implementations, the optional n in +the calls to the constructor, resize, and rehash +indicates not the desired number of buckets that +should be allocated, but instead the expected number of items to be +inserted. The class then sizes the hash-set appropriately for the +number of items specified. It's not an error to actually insert more +or fewer items into the hashtable, but the implementation is most +efficient -- does the fewest hashtable resizes -- if the number of +inserted items is n or slightly less.

+ +

[4] + +dense_hash_set requires you call +set_empty_key() immediately after constructing the hash-set, +and before calling any other dense_hash_set method. (This is +the largest difference between the dense_hash_set API and +other hash-set APIs. See implementation.html +for why this is necessary.) +The argument to set_empty_key() should be a key-value that +is never used for legitimate hash-set entries. If you have no such +key value, you will be unable to use dense_hash_set. It is +an error to call insert() with an item whose key is the +"empty key."

+ +dense_hash_set also requires you call +set_deleted_key() before calling erase(). +The argument to set_deleted_key() should be a key-value that +is never used for legitimate hash-set entries. It must be different +from the key-value used for set_empty_key(). It is an error to call +erase() without first calling set_deleted_key(), and +it is also an error to call insert() with an item whose key +is the "deleted key."

+ +

There is no need to call set_deleted_key if you do not +wish to call erase() on the hash-set.

+ +

It is acceptable to change the deleted-key at any time by calling +set_deleted_key() with a new argument. You can also call +clear_deleted_key(), at which point all keys become valid for +insertion but no hashtable entries can be deleted until +set_deleted_key() is called again.

+ + +

Input/Output

+ +
+

IMPORTANT IMPLEMENTATION NOTE: In the current version of +this code, the input/output routines for dense_hash_set have +not yet been implemented. This section explains the API, but +note that all calls to these routines will fail (return +false). It is a TODO to remedy this situation.

+
+ +

It is possible to save and restore dense_hash_set objects +to disk. Storage takes place in two steps. The first writes the +hashtable metadata. The second writes the actual data.

+ +

To write a hashtable to disk, first call write_metadata() +on an open file pointer. This saves the hashtable information in a +byte-order-independent format.

+ +

After the metadata has been written to disk, you must write the +actual data stored in the hash-set to disk. If both the key and data +are "simple" enough, you can do this by calling +write_nopointer_data(). "Simple" data is data that can be +safely copied to disk via fwrite(). Native C data types fall +into this category, as do structs of native C data types. Pointers +and STL objects do not.

+ +

Note that write_nopointer_data() does not do any endian +conversion. Thus, it is only appropriate when you intend to read the +data on the same endian architecture as you write the data.

+ +

If you cannot use write_nopointer_data() for any reason, +you can write the data yourself by iterating over the +dense_hash_set with a const_iterator and writing +the key and data in any manner you wish.

+ +

To read the hashtable information from disk, first you must create +a dense_hash_set object. Then open a file pointer to point +to the saved hashtable, and call read_metadata(). If you +saved the data via write_nopointer_data(), you can follow the +read_metadata() call with a call to +read_nopointer_data(). This is all that is needed.

+ +

If you saved the data through a custom write routine, you must call +a custom read routine to read in the data. To do this, iterate over +the dense_hash_set with an iterator; this operation +is sensical because the metadata has already been set up. For each +iterator item, you can read the key and value from disk, and set it +appropriately. You will need to do a const_cast on the +iterator, since *it is always const. The +code might look like this:

+
+   for (dense_hash_set<int*>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       const_cast<int*>(*it) = new int;
+       fread(const_cast<int*>(*it), sizeof(int), 1, fp);
+   }
+
+ +

Here's another example, where the item stored in the hash-set is +a C++ object with a non-trivial constructor. In this case, you must +use "placement new" to construct the object at the correct memory +location.

+
+   for (dense_hash_set<ComplicatedClass>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       int ctor_arg;  // ComplicatedClass takes an int as its constructor arg
+       fread(&ctor_arg, sizeof(int), 1, fp);
+       new (const_cast<ComplicatedClass*>(&(*it))) ComplicatedClass(ctor_arg);
+   }
+
+ + +

Validity of Iterators

+ +

erase() is guaranteed not to invalidate any iterators -- +except for any iterators pointing to the item being erased, of course. +insert() invalidates all iterators, as does +resize().

+ +

This is implemented by making erase() not resize the +hashtable. If you desire maximum space efficiency, you can call +resize(0) after a string of erase() calls, to force +the hashtable to resize to the smallest possible size.

+ +

In addition to invalidating iterators, insert() +and resize() invalidate all pointers into the hashtable. If +you want to store a pointer to an object held in a dense_hash_set, +either do so after finishing hashtable inserts, or store the object on +the heap and a pointer to it in the dense_hash_set.

+ + + +

See also

+ +

The following are SGI STL, and some Google STL, concepts and +classes related to dense_hash_set.

+ +hash_set, +Associative Container, +Hashed Associative Container, +Simple Associative Container, +Unique Hashed Associative Container, +set, +map +multiset, +multimap, +hash_map, +hash_multiset, +hash_multimap, +sparse_hash_set, +sparse_hash_map, +dense_hash_map + + + diff --git a/src/sparsehash-1.6/doc/designstyle.css b/src/sparsehash-1.6/doc/designstyle.css new file mode 100644 index 0000000..f5d1ec2 --- /dev/null +++ b/src/sparsehash-1.6/doc/designstyle.css @@ -0,0 +1,115 @@ +body { + background-color: #ffffff; + color: black; + margin-right: 1in; + margin-left: 1in; +} + + +h1, h2, h3, h4, h5, h6 { + color: #3366ff; + font-family: sans-serif; +} +@media print { + /* Darker version for printing */ + h1, h2, h3, h4, h5, h6 { + color: #000080; + font-family: helvetica, sans-serif; + } +} + +h1 { + text-align: center; + font-size: 18pt; +} +h2 { + margin-left: -0.5in; +} +h3 { + margin-left: -0.25in; +} +h4 { + margin-left: -0.125in; +} +hr { + margin-left: -1in; +} + +/* Definition lists: definition term bold */ +dt { + font-weight: bold; +} + +address { + text-align: right; +} +/* Use the tag for bits of code and for variables and objects. */ +code,pre,samp,var { + color: #006000; +} +/* Use the tag for file and directory paths and names. */ +file { + color: #905050; + font-family: monospace; +} +/* Use the tag for stuff the user should type. */ +kbd { + color: #600000; +} +div.note p { + float: right; + width: 3in; + margin-right: 0%; + padding: 1px; + border: 2px solid #6060a0; + background-color: #fffff0; +} + +UL.nobullets { + list-style-type: none; + list-style-image: none; + margin-left: -1em; +} + +/* +body:after { + content: "Google Confidential"; +} +*/ + +/* pretty printing styles. See prettify.js */ +.str { color: #080; } +.kwd { color: #008; } +.com { color: #800; } +.typ { color: #606; } +.lit { color: #066; } +.pun { color: #660; } +.pln { color: #000; } +.tag { color: #008; } +.atn { color: #606; } +.atv { color: #080; } +pre.prettyprint { padding: 2px; border: 1px solid #888; } + +.embsrc { background: #eee; } + +@media print { + .str { color: #060; } + .kwd { color: #006; font-weight: bold; } + .com { color: #600; font-style: italic; } + .typ { color: #404; font-weight: bold; } + .lit { color: #044; } + .pun { color: #440; } + .pln { color: #000; } + .tag { color: #006; font-weight: bold; } + .atn { color: #404; } + .atv { color: #060; } +} + +/* Table Column Headers */ +.hdr { + color: #006; + font-weight: bold; + background-color: #dddddd; } +.hdr2 { + color: #006; + background-color: #eeeeee; } \ No newline at end of file diff --git a/src/sparsehash-1.6/doc/implementation.html b/src/sparsehash-1.6/doc/implementation.html new file mode 100644 index 0000000..2050d54 --- /dev/null +++ b/src/sparsehash-1.6/doc/implementation.html @@ -0,0 +1,371 @@ + + + +Implementation notes: sparse_hash, dense_hash, sparsetable + + + + +

Implementation of sparse_hash_map, dense_hash_map, and +sparsetable

+ +This document contains a few notes on how the data structures in this +package are implemented. This discussion refers at several points to +the classic text in this area: Knuth, The Art of Computer +Programming, Vol 3, Hashing. + + +
+

sparsetable

+ +

For specificity, consider the declaration

+ +
+   sparsetable<Foo> t(100);        // a sparse array with 100 elements
+
+ +

A sparsetable is a random container that implements a sparse array, +that is, an array that uses very little memory to store unassigned +indices (in this case, between 1-2 bits per unassigned index). For +instance, if you allocate an array of size 5 and assign a[2] = [big +struct], then a[2] will take up a lot of memory but a[0], a[1], a[3], +and a[4] will not. Array elements that have a value are called +"assigned". Array elements that have no value yet, or have had their +value cleared using erase() or clear(), are called "unassigned". +For assigned elements, lookups return the assigned value; for +unassigned elements, they return the default value, which for t is +Foo().

+ +

sparsetable is implemented as an array of "groups". Each group is +responsible for M array indices. The first group knows about +t[0]..t[M-1], the second about t[M]..t[2M-1], and so forth. (M is 48 +by default.) At construct time, t creates an array of (99/M + 1) +groups. From this point on, all operations -- insert, delete, lookup +-- are passed to the appropriate group. In particular, any operation +on t[i] is actually performed on (t.group[i / M])[i % M].

+ +

Each group contains of a vector, which holds assigned values, and a +bitmap of size M, which indicates which indices are assigned. A +lookup works as follows: the group is asked to look up index i, where +i < M. The group looks at bitmap[i]. If it's 0, the lookup fails. +If it's 1, then the group has to find the appropriate value in the +vector.

+ +

find()

+ +

Finding the appropriate vector element is the most expensive part of +the lookup. The code counts all bitmap entries <= i that are set to +1. (There's at least 1 of them, since bitmap[i] is 1.) Suppose there +are 4 such entries. Then the right value to return is the 4th element +of the vector: vector[3]. This takes time O(M), which is a constant +since M is a constant.

+ +

insert()

+ +

Insert starts with a lookup. If the lookup succeeds, the code merely +replaces vector[3] with the new value. If the lookup fails, then the +code must insert a new entry into the middle of the vector. Again, to +insert at position i, the code must count all the bitmap entries <= i +that are set to i. This indicates the position to insert into the +vector. All vector entries above that position must be moved to make +room for the new entry. This takes time, but still constant time +since the vector has size at most M.

+ +

(Inserts could be made faster by using a list instead of a vector to +hold group values, but this would use much more memory, since each +list element requires a full pointer of overhead.)

+ +

The only metadata that needs to be updated, after the actual value is +inserted, is to set bitmap[i] to 1. No other counts must be +maintained.

+ +

delete()

+ +

Deletes are similar to inserts. They start with a lookup. If it +fails, the delete is a noop. Otherwise, the appropriate entry is +removed from the vector, all the vector elements above it are moved +down one, and bitmap[i] is set to 0.

+ +

iterators

+ +

Sparsetable iterators pose a special burden. They must iterate over +unassigned array values, but the act of iterating should not cause an +assignment to happen -- otherwise, iterating over a sparsetable would +cause it to take up much more room. For const iterators, the matter +is simple: the iterator is merely programmed to return the default +value -- Foo() -- when dereferenced while pointing to an unassigned +entry.

+ +

For non-const iterators, such simple techniques fail. Instead, +dereferencing a sparsetable_iterator returns an opaque object that +acts like a Foo in almost all situations, but isn't actually a Foo. +(It does this by defining operator=(), operator value_type(), and, +most sneakily, operator&().) This works in almost all cases. If it +doesn't, an explicit cast to value_type will solve the problem:

+ +
+   printf("%d", static_cast<Foo>(*t.find(0)));
+
+ +

To avoid such problems, consider using get() and set() instead of an +iterator:

+ +
+   for (int i = 0; i < t.size(); ++i)
+      if (t.get(i) == ...)  t.set(i, ...);
+
+ +

Sparsetable also has a special class of iterator, besides normal and +const: nonempty_iterator. This only iterates over array values that +are assigned. This is particularly fast given the sparsetable +implementation, since it can ignore the bitmaps entirely and just +iterate over the various group vectors.

+ +

Resource use

+ +

The space overhead for an sparsetable of size N is N + 48N/M bits. +For the default value of M, this is exactly 2 bits per array entry. +(That's for 32-bit pointers; for machines with 64-bit pointers, it's N ++ 80N/M bits, or 2.67 bits per entry.) +A larger M would use less overhead -- approaching 1 bit per array +entry -- but take longer for inserts, deletes, and lookups. A smaller +M would use more overhead but make operations somewhat faster.

+ +

You can also look at some specific performance numbers.

+ + +
+

sparse_hash_set

+ +

For specificity, consider the declaration

+ +
+   sparse_hash_set<Foo> t;
+
+ +

sparse_hash_set is a hashtable. For more information on hashtables, +see Knuth. Hashtables are basically arrays with complicated logic on +top of them. sparse_hash_set uses a sparsetable to implement the +underlying array.

+ +

In particular, sparse_hash_set stores its data in a sparsetable using +quadratic internal probing (see Knuth). Many hashtable +implementations use external probing, so each table element is +actually a pointer chain, holding many hashtable values. +sparse_hash_set, on the other hand, always stores at most one value in +each table location. If the hashtable wants to store a second value +at a given table location, it can't; it's forced to look somewhere +else.

+ +

insert()

+ +

As a specific example, suppose t is a new sparse_hash_set. It then +holds a sparsetable of size 32. The code for t.insert(foo) works as +follows:

+ +

+1) Call hash<Foo>(foo) to convert foo into an integer i. (hash<Foo> is + the default hash function; you can specify a different one in the + template arguments.) + +

+2a) Look at t.sparsetable[i % 32]. If it's unassigned, assign it to + foo. foo is now in the hashtable. + +

+2b) If t.sparsetable[i % 32] is assigned, and its value is foo, then + do nothing: foo was already in t and the insert is a noop. + +

+2c) If t.sparsetable[i % 32] is assigned, but to a value other than + foo, look at t.sparsetable[(i+1) % 32]. If that also fails, try + t.sparsetable[(i+3) % 32], then t.sparsetable[(i+6) % 32]. In + general, keep trying the next triangular number. + +

+3) If the table is now "too full" -- say, 25 of the 32 table entries + are now assigned -- grow the table by creating a new sparsetable + that's twice as big, and rehashing every single element from the + old table into the new one. This keeps the table from ever filling + up. + +

+4) If the table is now "too empty" -- say, only 3 of the 32 table + entries are now assigned -- shrink the table by creating a new + sparsetable that's half as big, and rehashing every element as in + the growing case. This keeps the table overhead proportional to + the number of elements in the table. +

+ +

Instead of using triangular numbers as offsets, one could just use +regular integers: try i, then i+1, then i+2, then i+3. This has bad +'clumping' behavior, as explored in Knuth. Quadratic probing, using +the triangular numbers, avoids the clumping while keeping cache +coherency in the common case. As long as the table size is a power of +2, the quadratic-probing method described above will explore every +table element if necessary, to find a good place to insert.

+ +

(As a side note, using a table size that's a power of two has several +advantages, including the speed of calculating (i % table_size). On +the other hand, power-of-two tables are not very forgiving of a poor +hash function. Make sure your hash function is a good one! There are +plenty of dos and don'ts on the web (and in Knuth), for writing hash +functions.)

+ +

The "too full" value, also called the "maximum occupancy", determines +a time-space tradeoff: in general, the higher it is, the less space is +wasted but the more probes must be performed for each insert. +sparse_hash_set uses a high maximum occupancy, since space is more +important than speed for this data structure.

+ +

The "too empty" value is not necessary for performance but helps with +space use. It's rare for hashtable implementations to check this +value at insert() time -- after all, how will inserting cause a +hashtable to get too small? However, the sparse_hash_set +implementation never resizes on erase(); it's nice to have an erase() +that does not invalidate iterators. Thus, the first insert() after a +long string of erase()s could well trigger a hashtable shrink.

+ +

find()

+ +

find() works similarly to insert. The only difference is in step +(2a): if the value is unassigned, then the lookup fails immediately.

+ +

delete()

+ +

delete() is tricky in an internal-probing scheme. The obvious +implementation of just "unassigning" the relevant table entry doesn't +work. Consider the following scenario:

+ +
+    t.insert(foo1);         // foo1 hashes to 4, is put in table[4]
+    t.insert(foo2);         // foo2 hashes to 4, is put in table[5]
+    t.erase(foo1);          // table[4] is now 'unassigned'
+    t.lookup(foo2);         // fails since table[hash(foo2)] is unassigned
+
+ +

To avoid these failure situations, delete(foo1) is actually +implemented by replacing foo1 by a special 'delete' value in the +hashtable. This 'delete' value causes the table entry to be +considered unassigned for the purposes of insertion -- if foo3 hashes +to 4 as well, it can go into table[4] no problem -- but assigned for +the purposes of lookup.

+ +

What is this special 'delete' value? The delete value has to be an +element of type Foo, since the table can't hold anything else. It +obviously must be an element the client would never want to insert on +its own, or else the code couldn't distinguish deleted entries from +'real' entries with the same value. There's no way to determine a +good value automatically. The client has to specify it explicitly. +This is what the set_deleted_key() method does.

+ +

Note that set_deleted_key() is only necessary if the client actually +wants to call t.erase(). For insert-only hash-sets, set_deleted_key() +is unnecessary.

+ +

When copying the hashtable, either to grow it or shrink it, the +special 'delete' values are not copied into the new table. The +copy-time rehash makes them unnecessary.

+ +

Resource use

+ +

The data is stored in a sparsetable, so space use is the same as +for sparsetable. However, by default the sparse_hash_set +implementation tries to keep about half the table buckets empty, to +keep lookup-chains short. Since sparsehashmap has about 2 bits +overhead per bucket (or 2.5 bits on 64-bit systems), sparse_hash_map +has about 4-5 bits overhead per hashtable item.

+ +

Time use is also determined in large part by the sparsetable +implementation. However, there is also an extra probing cost in +hashtables, which depends in large part on the "too full" value. It +should be rare to need more than 4-5 probes per lookup, and usually +significantly less will suffice.

+ +

A note on growing and shrinking the hashtable: all hashtable +implementations use the most memory when growing a hashtable, since +they must have room for both the old table and the new table at the +same time. sparse_hash_set is careful to delete entries from the old +hashtable as soon as they're copied into the new one, to minimize this +space overhead. (It does this efficiently by using its knowledge of +the sparsetable class and copying one sparsetable group at a time.)

+ +

You can also look at some specific performance numbers.

+ + +
+

sparse_hash_map

+ +

sparse_hash_map is implemented identically to sparse_hash_set. The +only difference is instead of storing just Foo in each table entry, +the data structure stores pair<Foo, Value>.

+ + +
+

dense_hash_set

+ +

The hashtable aspects of dense_hash_set are identical to +sparse_hash_set: it uses quadratic internal probing, and resizes +hashtables in exactly the same way. The difference is in the +underlying array: instead of using a sparsetable, dense_hash_set uses +a C array. This means much more space is used, especially if Foo is +big. However, it makes all operations faster, since sparsetable has +memory management overhead that C arrays do not.

+ +

The use of C arrays instead of sparsetables points to one immediate +complication dense_hash_set has that sparse_hash_set does not: the +need to distinguish assigned from unassigned entries. In a +sparsetable, this is accomplished by a bitmap. dense_hash_set, on the +other hand, uses a dedicated value to specify unassigned entries. +Thus, dense_hash_set has two special values: one to indicate deleted +table entries, and one to indicated unassigned table entries. At +construct time, all table entries are initialized to 'unassigned'.

+ +

dense_hash_set provides the method set_empty_key() to indicate the +value that should be used for unassigned entries. Like +set_deleted_key(), set_empty_key() requires a value that will not be +used by the client for any legitimate purpose. Unlike +set_deleted_key(), set_empty_key() is always required, no matter what +hashtable operations the client wishes to perform.

+ +

Resource use

+ +

This implementation is fast because even though dense_hash_set may not +be space efficient, most lookups are localized: a single lookup may +need to access table[i], and maybe table[i+1] and table[i+3], but +nothing other than that. For all but the biggest data structures, +these will frequently be in a single cache line.

+ +

This implementation takes, for every unused bucket, space as big as +the key-type. Usually between half and two-thirds of the buckets are +empty.

+ +

The doubling method used by dense_hash_set tends to work poorly +with most memory allocators. This is because memory allocators tend +to have memory 'buckets' which are a power of two. Since each +doubling of a dense_hash_set doubles the memory use, a single +hashtable doubling will require a new memory 'bucket' from the memory +allocator, leaving the old bucket stranded as fragmented memory. +Hence, it's not recommended this data structure be used with many +inserts in memory-constrained situations.

+ +

You can also look at some specific performance numbers.

+ + +
+

dense_hash_map

+ +

dense_hash_map is identical to dense_hash_set except for what values +are stored in each table entry.

+ +
+ +Craig Silverstein
+Thu Jan 6 20:15:42 PST 2005 +
+ + + diff --git a/src/sparsehash-1.6/doc/index.html b/src/sparsehash-1.6/doc/index.html new file mode 100644 index 0000000..68a5865 --- /dev/null +++ b/src/sparsehash-1.6/doc/index.html @@ -0,0 +1,69 @@ + + + + Google Sparsehash Package + + + + + + + + +

Google Sparsehash Package

+
+ +

The Google sparsehash package consists of two hashtable +implementations: sparse, which is designed to be very space +efficient, and dense, which is designed to be very time +efficient. For each one, the package provides both a hash-map and a +hash-set, to mirror the classes in the common STL implementation.

+ +

Documentation on how to use these classes:

+ + +

In addition to the hash-map (and hash-set) classes, there's also a +lower-level class that implements a "sparse" array. This class can be +useful in its own right; consider using it when you'd normally use a +sparse_hash_map, but your keys are all small-ish +integers.

+ + +

There is also a doc explaining the implementation details of these +classes, for those who are curious. And finally, you can see some +performance comparisons, both between +the various classes here, but also between these implementations and +other standard hashtable implementations.

+ +
+
+Craig Silverstein
+Last modified: Thu Jan 25 17:58:02 PST 2007 +
+ + + diff --git a/src/sparsehash-1.6/doc/performance.html b/src/sparsehash-1.6/doc/performance.html new file mode 100644 index 0000000..40c1406 --- /dev/null +++ b/src/sparsehash-1.6/doc/performance.html @@ -0,0 +1,96 @@ + + + +Performance notes: sparse_hash, dense_hash, sparsetable + + + + +

Performance Numbers

+ +

Here are some performance numbers from an example desktop machine, +taken from a version of time_hash_map that was instrumented to also +report memory allocation information (this modification is not +included by default because it required a big hack to do, including +modifying the STL code to not try to do its own freelist management).

+ +

Note there are lots of caveats on these numbers: they may differ from +machine to machine and compiler to compiler, and they only test a very +particular usage pattern that may not match how you use hashtables -- +for instance, they test hashtables with very small keys. However, +they're still useful for a baseline comparison of the various +hashtable implementations.

+ +

These figures are from a 2.80GHz Pentium 4 with 2G of memory. The +'standard' hash_map and map implementations are the SGI STL code +included with gcc2. Compiled with gcc2.95.3 -g +-O2

+ +
+======
+Average over 10000000 iterations
+Wed Dec  8 14:56:38 PST 2004
+
+SPARSE_HASH_MAP:
+map_grow                  665 ns
+map_predict/grow          303 ns
+map_replace               177 ns
+map_fetch                 117 ns
+map_remove                192 ns
+memory used in map_grow    84.3956 Mbytes
+
+DENSE_HASH_MAP:
+map_grow                   84 ns
+map_predict/grow           22 ns
+map_replace                18 ns
+map_fetch                  13 ns
+map_remove                 23 ns
+memory used in map_grow   256.0000 Mbytes
+
+STANDARD HASH_MAP:
+map_grow                  162 ns
+map_predict/grow          107 ns
+map_replace                44 ns
+map_fetch                  22 ns
+map_remove                124 ns
+memory used in map_grow   204.1643 Mbytes
+
+STANDARD MAP:
+map_grow                  297 ns
+map_predict/grow          282 ns
+map_replace               113 ns
+map_fetch                 113 ns
+map_remove                238 ns
+memory used in map_grow   236.8081 Mbytes
+
+ + +

A Note on Hash Functions

+ +

For good performance, the Google hash routines depend on a good +hash function: one that distributes data evenly. Many hashtable +implementations come with sub-optimal hash functions that can degrade +performance. For instance, the hash function given in Knuth's _Art of +Computer Programming_, and the default string hash function in SGI's +STL implementation, both distribute certain data sets unevenly, +leading to poor performance.

+ +

As an example, in one test of the default SGI STL string hash +function against the Hsieh hash function (see below), for a particular +set of string keys, the Hsieh function resulted in hashtable lookups +that were 20 times as fast as the STLPort hash function. The string +keys were chosen to be "hard" to hash well, so these results may not +be typical, but they are suggestive.

+ +

There has been much research over the years into good hash +functions. Here are some hash functions of note.

+ + + + + diff --git a/src/sparsehash-1.6/doc/sparse_hash_map.html b/src/sparsehash-1.6/doc/sparse_hash_map.html new file mode 100644 index 0000000..63055c9 --- /dev/null +++ b/src/sparsehash-1.6/doc/sparse_hash_map.html @@ -0,0 +1,1527 @@ + + + + + +sparse_hash_map<Key, Data, HashFcn, EqualKey, Alloc> + + + + +

[Note: this document is formatted similarly to the SGI STL +implementation documentation pages, and refers to concepts and classes +defined there. However, neither this document nor the code it +describes is associated with SGI, nor is it necessary to have SGI's +STL implementation installed in order to use this class.]

+ + +

sparse_hash_map<Key, Data, HashFcn, EqualKey, Alloc>

+ +

sparse_hash_map is a Hashed +Associative Container that associates objects of type Key +with objects of type Data. sparse_hash_map is a Pair +Associative Container, meaning that its value type is pair<const Key, Data>. It is also a +Unique +Associative Container, meaning that no two elements have keys that +compare equal using EqualKey.

+ +

Looking up an element in a sparse_hash_map by its key is +efficient, so sparse_hash_map is useful for "dictionaries" +where the order of elements is irrelevant. If it is important for the +elements to be in a particular order, however, then map is more appropriate.

+ +

sparse_hash_map is distinguished from other hash-map +implementations by its stingy use of memory and by the ability to save +and restore contents to disk. On the other hand, this hash-map +implementation, while still efficient, is slower than other hash-map +implementations, and it also has requirements -- for instance, for a +distinguished "deleted key" -- that may not be easy for all +applications to satisfy.

+ +

This class is appropriate for applications that need to store +large "dictionaries" in memory, or for applications that need these +dictionaries to be persistent.

+ + +

Example

+ +(Note: this example uses SGI semantics for hash<> +-- the kind used by gcc and most Unix compiler suites -- and not +Dinkumware semantics -- the kind used by Microsoft Visual Studio. If +you are using MSVC, this example will not compile as-is: you'll need +to change hash to hash_compare, and you +won't use eqstr at all. See the MSVC documentation for +hash_map and hash_compare, for more +details.) + +
+#include <iostream>
+#include <google/sparse_hash_map>
+
+using google::sparse_hash_map;      // namespace where class lives by default
+using std::cout;
+using std::endl;
+using ext::hash;  // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
+
+struct eqstr
+{
+  bool operator()(const char* s1, const char* s2) const
+  {
+    return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
+  }
+};
+
+int main()
+{
+  sparse_hash_map<const char*, int, hash<const char*>, eqstr> months;
+  
+  months["january"] = 31;
+  months["february"] = 28;
+  months["march"] = 31;
+  months["april"] = 30;
+  months["may"] = 31;
+  months["june"] = 30;
+  months["july"] = 31;
+  months["august"] = 31;
+  months["september"] = 30;
+  months["october"] = 31;
+  months["november"] = 30;
+  months["december"] = 31;
+  
+  cout << "september -> " << months["september"] << endl;
+  cout << "april     -> " << months["april"] << endl;
+  cout << "june      -> " << months["june"] << endl;
+  cout << "november  -> " << months["november"] << endl;
+}
+
+ + +

Definition

+ +Defined in the header sparse_hash_map. +This class is not part of the C++ standard, though it is mostly +compatible with the tr1 class unordered_map. + + +

Template parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
+ Key + + The hash_map's key type. This is also defined as + sparse_hash_map::key_type. + +   +
+ Data + + The hash_map's data type. This is also defined as + sparse_hash_map::data_type. + +   +
+ HashFcn + + The hash function used by the + hash_map. This is also defined as sparse_hash_map::hasher. +
Note: Hashtable performance depends heavliy on the choice of + hash function. See the performance + page for more information. +
+ hash<Key> +
+ EqualKey + + The hash_map key equality function: a binary predicate that determines + whether two keys are equal. This is also defined as + sparse_hash_map::key_equal. + + equal_to<Key> +
+ Alloc + + Ignored; this is included only for API-compatibility + with SGI's (and tr1's) STL implementation. + +
+ + +

Model of

+ +Unique Hashed Associative Container, +Pair Associative Container + + +

Type requirements

+ +
    +
  • +Key is Assignable. +
  • +EqualKey is a Binary Predicate whose argument type is Key. +
  • +EqualKey is an equivalence relation. +
  • +Alloc is an Allocator. +
+ + +

Public base classes

+ +None. + + +

Members

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberWhere definedDescription
+ key_type + + Associative + Container + + The sparse_hash_map's key type, Key. +
+ data_type + + Pair + Associative Container + + The type of object associated with the keys. +
+ value_type + + Pair + Associative Container + + The type of object, pair<const key_type, data_type>, + stored in the hash_map. +
+ hasher + + Hashed + Associative Container + + The sparse_hash_map's hash + function. +
+ key_equal + + Hashed + Associative Container + + Function + object that compares keys for equality. +
+ allocator_type + + Unordered Associative Container (tr1) + + The type of the Allocator given as a template parameter. +
+ pointer + + Container + + Pointer to T. +
+ reference + + Container + + Reference to T +
+ const_reference + + Container + + Const reference to T +
+ size_type + + Container + + An unsigned integral type. +
+ difference_type + + Container + + A signed integral type. +
+ iterator + + Container + + Iterator used to iterate through a sparse_hash_map. [1] +
+ const_iterator + + Container + + Const iterator used to iterate through a sparse_hash_map. +
+ local_iterator + + Unordered Associative Container (tr1) + + Iterator used to iterate through a subset of + sparse_hash_map. [1] +
+ const_local_iterator + + Unordered Associative Container (tr1) + + Const iterator used to iterate through a subset of + sparse_hash_map. +
+ iterator begin() + + Container + + Returns an iterator pointing to the beginning of the + sparse_hash_map. +
+ iterator end() + + Container + + Returns an iterator pointing to the end of the + sparse_hash_map. +
+ const_iterator begin() const + + Container + + Returns an const_iterator pointing to the beginning of the + sparse_hash_map. +
+ const_iterator end() const + + Container + + Returns an const_iterator pointing to the end of the + sparse_hash_map. +
+ local_iterator begin(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the beginning of bucket + i in the sparse_hash_map. +
+ local_iterator end(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the end of bucket + i in the sparse_hash_map. For + sparse_hash_map, each bucket contains either 0 or 1 item. +
+ const_local_iterator begin(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the beginning of bucket + i in the sparse_hash_map. +
+ const_local_iterator end(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the end of bucket + i in the sparse_hash_map. For + sparse_hash_map, each bucket contains either 0 or 1 item. +
+ size_type size() const + + Container + + Returns the size of the sparse_hash_map. +
+ size_type max_size() const + + Container + + Returns the largest possible size of the sparse_hash_map. +
+ bool empty() const + + Container + + true if the sparse_hash_map's size is 0. +
+ size_type bucket_count() const + + Hashed + Associative Container + + Returns the number of buckets used by the sparse_hash_map. +
+ size_type max_bucket_count() const + + Hashed + Associative Container + + Returns the largest possible number of buckets used by the sparse_hash_map. +
+ size_type bucket_size(size_type i) const + + Unordered Associative Container (tr1) + + Returns the number of elements in bucket i. For + sparse_hash_map, this will be either 0 or 1. +
+ size_type bucket(const key_type& key) const + + Unordered Associative Container (tr1) + + If the key exists in the map, returns the index of the bucket + containing the given key, otherwise, return the bucket the key + would be inserted into. + This value may be passed to begin(size_type) and + end(size_type). +
+ float load_factor() const + + Unordered Associative Container (tr1) + + The number of elements in the sparse_hash_map divided by + the number of buckets. +
+ float max_load_factor() const + + Unordered Associative Container (tr1) + + The maximum load factor before increasing the number of buckets in + the sparse_hash_map. +
+ void max_load_factor(float new_grow) + + Unordered Associative Container (tr1) + + Sets the maximum load factor before increasing the number of + buckets in the sparse_hash_map. +
+ float min_load_factor() const + + sparse_hash_map + + The minimum load factor before decreasing the number of buckets in + the sparse_hash_map. +
+ void min_load_factor(float new_grow) + + sparse_hash_map + + Sets the minimum load factor before decreasing the number of + buckets in the sparse_hash_map. +
+ void set_resizing_parameters(float shrink, float grow) + + sparse_hash_map + + DEPRECATED. See below. +
+ void resize(size_type n) + + Hashed + Associative Container + + Increases the bucket count to hold at least n items. + [4] [5] +
+ void rehash(size_type n) + + Unordered Associative Container (tr1) + + Increases the bucket count to hold at least n items. + This is identical to resize. + [4] [5] +
+ hasher hash_funct() const + + Hashed + Associative Container + + Returns the hasher object used by the sparse_hash_map. +
+ hasher hash_function() const + + Unordered Associative Container (tr1) + + Returns the hasher object used by the sparse_hash_map. + This is idential to hash_funct. +
+ key_equal key_eq() const + + Hashed + Associative Container + + Returns the key_equal object used by the + sparse_hash_map. +
+ sparse_hash_map() + + Container + + Creates an empty sparse_hash_map. +
+ sparse_hash_map(size_type n) + + Hashed + Associative Container + + Creates an empty sparse_hash_map that's optimized for holding + up to n items. + [5] +
+ sparse_hash_map(size_type n, const hasher& h) + + Hashed + Associative Container + + Creates an empty sparse_hash_map that's optimized for up + to n items, using h as the hash function. +
+ sparse_hash_map(size_type n, const hasher& h, const + key_equal& k) + + Hashed + Associative Container + + Creates an empty sparse_hash_map that's optimized for up + to n items, using h as the hash function and + k as the key equal function. +
+
template <class InputIterator>
+sparse_hash_map(InputIterator f, InputIterator l) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a sparse_hash_map with a copy of a range. +
+
template <class InputIterator>
+sparse_hash_map(InputIterator f, InputIterator l, size_type n) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized to + hold up to n items. +
+
template <class InputIterator>
+sparse_hash_map(InputIterator f, InputIterator l, size_type n, const
+hasher& h) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized to hold + up to n items, using h as the hash function. +
+
template <class InputIterator>
+sparse_hash_map(InputIterator f, InputIterator l, size_type n, const
+hasher& h, const key_equal& k) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_map with a copy of a range that's optimized for + holding up to n items, using h as the hash + function and k as the key equal function. +
+ sparse_hash_map(const hash_map&) + + Container + + The copy constructor. +
+ sparse_hash_map& operator=(const hash_map&) + + Container + + The assignment operator +
+ void swap(hash_map&) + + Container + + Swaps the contents of two hash_maps. +
+
pair<iterator, bool> insert(const value_type& x)
+
+
+ Unique + Associative Container + + Inserts x into the sparse_hash_map. +
+
template <class InputIterator>
+void insert(InputIterator f, InputIterator l) 
[2] +
+ Unique + Associative Container + + Inserts a range into the sparse_hash_map. +
+ void set_deleted_key(const key_type& key) [6] + + sparse_hash_map + + See below. +
+ void clear_deleted_key() [6] + + sparse_hash_map + + See below. +
+ void erase(iterator pos) + + Associative + Container + + Erases the element pointed to by pos. + [6] +
+ size_type erase(const key_type& k) + + Associative + Container + + Erases the element whose key is k. + [6] +
+ void erase(iterator first, iterator last) + + Associative + Container + + Erases all elements in a range. + [6] +
+ void clear() + + Associative + Container + + Erases all of the elements. +
+ const_iterator find(const key_type& k) const + + Associative + Container + + Finds an element whose key is k. +
+ iterator find(const key_type& k) + + Associative + Container + + Finds an element whose key is k. +
+ size_type count(const key_type& k) const + + Unique + Associative Container + + Counts the number of elements whose key is k. +
+
pair<const_iterator, const_iterator> equal_range(const
+key_type& k) const 
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+
pair<iterator, iterator> equal_range(const
+key_type& k) 
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+
data_type& operator[](const key_type& k) [3] 
+
+ sparse_hash_map + + See below. +
+ bool write_metadata(FILE *fp) + + sparse_hash_map + + See below. +
+ bool read_metadata(FILE *fp) + + sparse_hash_map + + See below. +
+ bool write_nopointer_data(FILE *fp) + + sparse_hash_map + + See below. +
+ bool read_nopointer_data(FILE *fp) + + sparse_hash_map + + See below. +
+
bool operator==(const hash_map&, const hash_map&)
+
+
+ Hashed + Associative Container + + Tests two hash_maps for equality. This is a global function, not a + member function. +
+ + +

New members

+ +These members are not defined in the Unique +Hashed Associative Container, Pair +Associative Container, or tr1's +Unordered Associative Container requirements, +but are specific to sparse_hash_map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDescription
+ void set_deleted_key(const key_type& key) + + Sets the distinguished "deleted" key to key. This must be + called before any calls to erase(). [6] +
+ void clear_deleted_key() + + Clears the distinguished "deleted" key. After this is called, + calls to erase() are not valid on this object. + [6] +
+
+data_type& 
+operator[](const key_type& k) [3]
+
+
+ Returns a reference to the object that is associated with + a particular key. If the sparse_hash_map does not already + contain such an object, operator[] inserts the default + object data_type(). [3] +
+ void set_resizing_parameters(float shrink, float grow) + + This function is DEPRECATED. It is equivalent to calling + min_load_factor(shrink); max_load_factor(grow). +
+ bool write_metadata(FILE *fp) + + Write hashtable metadata to fp. See below. +
+ bool read_metadata(FILE *fp) + + Read hashtable metadata from fp. See below. +
+ bool write_nopointer_data(FILE *fp) + + Write hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ bool read_nopointer_data(FILE *fp) + + Read hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ + +

Notes

+ +

[1] + +sparse_hash_map::iterator is not a mutable iterator, because +sparse_hash_map::value_type is not Assignable. +That is, if i is of type sparse_hash_map::iterator +and p is of type sparse_hash_map::value_type, then +*i = p is not a valid expression. However, +sparse_hash_map::iterator isn't a constant iterator either, +because it can be used to modify the object that it points to. Using +the same notation as above, (*i).second = p is a valid +expression.

+ +

[2] + +This member function relies on member template functions, which +may not be supported by all compilers. If your compiler supports +member templates, you can call this function with any type of input +iterator. If your compiler does not yet support member templates, +though, then the arguments must either be of type const +value_type* or of type sparse_hash_map::const_iterator.

+ +

[3] + +Since operator[] might insert a new element into the +sparse_hash_map, it can't possibly be a const member +function. Note that the definition of operator[] is +extremely simple: m[k] is equivalent to +(*((m.insert(value_type(k, data_type()))).first)).second. +Strictly speaking, this member function is unnecessary: it exists only +for convenience.

+ +

[4] + +In order to preserve iterators, erasing hashtable elements does not +cause a hashtable to resize. This means that after a string of +erase() calls, the hashtable will use more space than is +required. At a cost of invalidating all current iterators, you can +call resize() to manually compact the hashtable. The +hashtable promotes too-small resize() arguments to the +smallest legal value, so to compact a hashtable, it's sufficient to +call resize(0). + +

[5] + +Unlike some other hashtable implementations, the optional n in +the calls to the constructor, resize, and rehash +indicates not the desired number of buckets that +should be allocated, but instead the expected number of items to be +inserted. The class then sizes the hash-map appropriately for the +number of items specified. It's not an error to actually insert more +or fewer items into the hashtable, but the implementation is most +efficient -- does the fewest hashtable resizes -- if the number of +inserted items is n or slightly less.

+ +

[6] + +sparse_hash_map requires you call +set_deleted_key() before calling erase(). (This is +the largest difference between the sparse_hash_map API and +other hash-map APIs. See implementation.html +for why this is necessary.) +The argument to set_deleted_key() should be a key-value that +is never used for legitimate hash-map entries. It is an error to call +erase() without first calling set_deleted_key(), and +it is also an error to call insert() with an item whose key +is the "deleted key."

+ +

There is no need to call set_deleted_key if you do not +wish to call erase() on the hash-map.

+ +

It is acceptable to change the deleted-key at any time by calling +set_deleted_key() with a new argument. You can also call +clear_deleted_key(), at which point all keys become valid for +insertion but no hashtable entries can be deleted until +set_deleted_key() is called again.

+ +

Note: If you use set_deleted_key, it is also +necessary that data_type has a zero-argument default +constructor. This is because sparse_hash_map uses the +special value pair(deleted_key, data_type()) to denote +deleted buckets, and thus needs to be able to create +data_type using a zero-argument constructor.

+ +

If your data_type does not have a zero-argument default +constructor, there are several workarounds:

+
    +
  • Store a pointer to data_type in the map, instead of + data_type directly. This may yield faster code as + well, since hashtable-resizes will just have to move pointers + around, rather than copying the entire data_type. +
  • Add a zero-argument default constructor to data_type. +
  • Subclass data_type and add a zero-argument default + constructor to the subclass. +
+ +

If you do not use set_deleted_key, then there is no +requirement that data_type havea zero-argument default +constructor. + + +

Input/Output

+ +

It is possible to save and restore sparse_hash_map objects +to disk. Storage takes place in two steps. The first writes the +hashtable metadata. The second writes the actual data.

+ +

To write a hashtable to disk, first call write_metadata() +on an open file pointer. This saves the hashtable information in a +byte-order-independent format.

+ +

After the metadata has been written to disk, you must write the +actual data stored in the hash-map to disk. If both the key and data +are "simple" enough, you can do this by calling +write_nopointer_data(). "Simple" data is data that can be +safely copied to disk via fwrite(). Native C data types fall +into this category, as do structs of native C data types. Pointers +and STL objects do not.

+ +

Note that write_nopointer_data() does not do any endian +conversion. Thus, it is only appropriate when you intend to read the +data on the same endian architecture as you write the data.

+ +

If you cannot use write_nopointer_data() for any reason, +you can write the data yourself by iterating over the +sparse_hash_map with a const_iterator and writing +the key and data in any manner you wish.

+ +

To read the hashtable information from disk, first you must create +a sparse_hash_map object. Then open a file pointer to point +to the saved hashtable, and call read_metadata(). If you +saved the data via write_nopointer_data(), you can follow the +read_metadata() call with a call to +read_nopointer_data(). This is all that is needed.

+ +

If you saved the data through a custom write routine, you must call +a custom read routine to read in the data. To do this, iterate over +the sparse_hash_map with an iterator; this operation +is sensical because the metadata has already been set up. For each +iterator item, you can read the key and value from disk, and set it +appropriately. You will need to do a const_cast on the +iterator, since it->first is always const. You +will also need to use placement-new if the key or value is a C++ +object. The code might look like this:

+
+   for (sparse_hash_map<int*, ComplicatedClass>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       // The key is stored in the sparse_hash_map as a pointer
+       const_cast<int*>(it->first) = new int;
+       fread(const_cast<int*>(it->first), sizeof(int), 1, fp);
+       // The value is a complicated C++ class that takes an int to construct
+       int ctor_arg;
+       fread(&ctor_arg, sizeof(int), 1, fp);
+       new (&it->second) ComplicatedClass(ctor_arg);  // "placement new"
+   }
+
+ + +

Validity of Iterators

+ +

erase() is guaranteed not to invalidate any iterators -- +except for any iterators pointing to the item being erased, of course. +insert() invalidates all iterators, as does +resize().

+ +

This is implemented by making erase() not resize the +hashtable. If you desire maximum space efficiency, you can call +resize(0) after a string of erase() calls, to force +the hashtable to resize to the smallest possible size.

+ +

In addition to invalidating iterators, insert() +and resize() invalidate all pointers into the hashtable. If +you want to store a pointer to an object held in a sparse_hash_map, +either do so after finishing hashtable inserts, or store the object on +the heap and a pointer to it in the sparse_hash_map.

+ + +

See also

+ +

The following are SGI STL, and some Google STL, concepts and +classes related to sparse_hash_map.

+ +hash_map, +Associative Container, +Hashed Associative Container, +Pair Associative Container, +Unique Hashed Associative Container, +set, +map +multiset, +multimap, +hash_set, +hash_multiset, +hash_multimap, +sparsetable, +sparse_hash_set, +dense_hash_set, +dense_hash_map + + + diff --git a/src/sparsehash-1.6/doc/sparse_hash_set.html b/src/sparsehash-1.6/doc/sparse_hash_set.html new file mode 100644 index 0000000..70c7721 --- /dev/null +++ b/src/sparsehash-1.6/doc/sparse_hash_set.html @@ -0,0 +1,1376 @@ + + + + + +sparse_hash_set<Key, HashFcn, EqualKey, Alloc> + + + + +

[Note: this document is formatted similarly to the SGI STL +implementation documentation pages, and refers to concepts and classes +defined there. However, neither this document nor the code it +describes is associated with SGI, nor is it necessary to have SGI's +STL implementation installed in order to use this class.]

+ + +

sparse_hash_set<Key, HashFcn, EqualKey, Alloc>

+ +

sparse_hash_set is a Hashed +Associative Container that stores objects of type Key. +sparse_hash_set is a Simple +Associative Container, meaning that its value type, as well as its +key type, is key. It is also a +Unique +Associative Container, meaning that no two elements have keys that +compare equal using EqualKey.

+ +

Looking up an element in a sparse_hash_set by its key is +efficient, so sparse_hash_set is useful for "dictionaries" +where the order of elements is irrelevant. If it is important for the +elements to be in a particular order, however, then map is more appropriate.

+ +

sparse_hash_set is distinguished from other hash-set +implementations by its stingy use of memory and by the ability to save +and restore contents to disk. On the other hand, this hash-set +implementation, while still efficient, is slower than other hash-set +implementations, and it also has requirements -- for instance, for a +distinguished "deleted key" -- that may not be easy for all +applications to satisfy.

+ +

This class is appropriate for applications that need to store +large "dictionaries" in memory, or for applications that need these +dictionaries to be persistent.

+ + +

Example

+ +(Note: this example uses SGI semantics for hash<> +-- the kind used by gcc and most Unix compiler suites -- and not +Dinkumware semantics -- the kind used by Microsoft Visual Studio. If +you are using MSVC, this example will not compile as-is: you'll need +to change hash to hash_compare, and you +won't use eqstr at all. See the MSVC documentation for +hash_map and hash_compare, for more +details.) + +
+#include <iostream>
+#include <google/sparse_hash_set>
+
+using google::sparse_hash_set;      // namespace where class lives by default
+using std::cout;
+using std::endl;
+using ext::hash;  // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
+
+struct eqstr
+{
+  bool operator()(const char* s1, const char* s2) const
+  {
+    return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
+  }
+};
+
+void lookup(const hash_set<const char*, hash<const char*>, eqstr>& Set,
+            const char* word)
+{
+  sparse_hash_set<const char*, hash<const char*>, eqstr>::const_iterator it
+    = Set.find(word);
+  cout << word << ": "
+       << (it != Set.end() ? "present" : "not present")
+       << endl;
+}
+
+int main()
+{
+  sparse_hash_set<const char*, hash<const char*>, eqstr> Set;
+  Set.insert("kiwi");
+  Set.insert("plum");
+  Set.insert("apple");
+  Set.insert("mango");
+  Set.insert("apricot");
+  Set.insert("banana");
+
+  lookup(Set, "mango");
+  lookup(Set, "apple");
+  lookup(Set, "durian");
+}
+
+ + +

Definition

+ +Defined in the header sparse_hash_set. +This class is not part of the C++ standard, though it is mostly +compatible with the tr1 class unordered_set. + + +

Template parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
+ Key + + The hash_set's key and value type. This is also defined as + sparse_hash_set::key_type and + sparse_hash_set::value_type. + +   +
+ HashFcn + + The hash function used by the + hash_set. This is also defined as sparse_hash_set::hasher. +
Note: Hashtable performance depends heavliy on the choice of + hash function. See the performance + page for more information. +
+ hash<Key> +
+ EqualKey + + The hash_set key equality function: a binary predicate that determines + whether two keys are equal. This is also defined as + sparse_hash_set::key_equal. + + equal_to<Key> +
+ Alloc + + Ignored; this is included only for API-compatibility + with SGI's (and tr1's) STL implementation. + +
+ + +

Model of

+ +Unique Hashed Associative Container, +Simple Associative Container + + +

Type requirements

+ +
    +
  • +Key is Assignable. +
  • +EqualKey is a Binary Predicate whose argument type is Key. +
  • +EqualKey is an equivalence relation. +
  • +Alloc is an Allocator. +
+ + +

Public base classes

+ +None. + + +

Members

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberWhere definedDescription
+ value_type + + Container + + The type of object, T, stored in the hash_set. +
+ key_type + + Associative + Container + + The key type associated with value_type. +
+ hasher + + Hashed + Associative Container + + The sparse_hash_set's hash + function. +
+ key_equal + + Hashed + Associative Container + + Function + object that compares keys for equality. +
+ allocator_type + + Unordered Associative Container (tr1) + + The type of the Allocator given as a template parameter. +
+ pointer + + Container + + Pointer to T. +
+ reference + + Container + + Reference to T +
+ const_reference + + Container + + Const reference to T +
+ size_type + + Container + + An unsigned integral type. +
+ difference_type + + Container + + A signed integral type. +
+ iterator + + Container + + Iterator used to iterate through a sparse_hash_set. +
+ const_iterator + + Container + + Const iterator used to iterate through a sparse_hash_set. + (iterator and const_iterator are the same type.) +
+ local_iterator + + Unordered Associative Container (tr1) + + Iterator used to iterate through a subset of + sparse_hash_set. +
+ const_local_iterator + + Unordered Associative Container (tr1) + + Const iterator used to iterate through a subset of + sparse_hash_set. +
+ iterator begin() const + + Container + + Returns an iterator pointing to the beginning of the + sparse_hash_set. +
+ iterator end() const + + Container + + Returns an iterator pointing to the end of the + sparse_hash_set. +
+ local_iterator begin(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the beginning of bucket + i in the sparse_hash_set. +
+ local_iterator end(size_type i) + + Unordered Associative Container (tr1) + + Returns a local_iterator pointing to the end of bucket + i in the sparse_hash_set. For + sparse_hash_set, each bucket contains either 0 or 1 item. +
+ const_local_iterator begin(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the beginning of bucket + i in the sparse_hash_set. +
+ const_local_iterator end(size_type i) const + + Unordered Associative Container (tr1) + + Returns a const_local_iterator pointing to the end of bucket + i in the sparse_hash_set. For + sparse_hash_set, each bucket contains either 0 or 1 item. +
+ size_type size() const + + Container + + Returns the size of the sparse_hash_set. +
+ size_type max_size() const + + Container + + Returns the largest possible size of the sparse_hash_set. +
+ bool empty() const + + Container + + true if the sparse_hash_set's size is 0. +
+ size_type bucket_count() const + + Hashed + Associative Container + + Returns the number of buckets used by the sparse_hash_set. +
+ size_type max_bucket_count() const + + Hashed + Associative Container + + Returns the largest possible number of buckets used by the sparse_hash_set. +
+ size_type bucket_size(size_type i) const + + Unordered Associative Container (tr1) + + Returns the number of elements in bucket i. For + sparse_hash_set, this will be either 0 or 1. +
+ size_type bucket(const key_type& key) const + + Unordered Associative Container (tr1) + + If the key exists in the map, returns the index of the bucket + containing the given key, otherwise, return the bucket the key + would be inserted into. + This value may be passed to begin(size_type) and + end(size_type). +
+ float load_factor() const + + Unordered Associative Container (tr1) + + The number of elements in the sparse_hash_set divided by + the number of buckets. +
+ float max_load_factor() const + + Unordered Associative Container (tr1) + + The maximum load factor before increasing the number of buckets in + the sparse_hash_set. +
+ void max_load_factor(float new_grow) + + Unordered Associative Container (tr1) + + Sets the maximum load factor before increasing the number of + buckets in the sparse_hash_set. +
+ float min_load_factor() const + + sparse_hash_set + + The minimum load factor before decreasing the number of buckets in + the sparse_hash_set. +
+ void min_load_factor(float new_grow) + + sparse_hash_set + + Sets the minimum load factor before decreasing the number of + buckets in the sparse_hash_set. +
+ void set_resizing_parameters(float shrink, float grow) + + sparse_hash_set + + DEPRECATED. See below. +
+ void resize(size_type n) + + Hashed + Associative Container + + Increases the bucket count to hold at least n items. + [2] [3] +
+ void rehash(size_type n) + + Unordered Associative Container (tr1) + + Increases the bucket count to hold at least n items. + This is identical to resize. + [2] [3] +
+ hasher hash_funct() const + + Hashed + Associative Container + + Returns the hasher object used by the sparse_hash_set. +
+ hasher hash_function() const + + Unordered Associative Container (tr1) + + Returns the hasher object used by the sparse_hash_set. + This is idential to hash_funct. +
+ key_equal key_eq() const + + Hashed + Associative Container + + Returns the key_equal object used by the + sparse_hash_set. +
+ sparse_hash_set() + + Container + + Creates an empty sparse_hash_set. +
+ sparse_hash_set(size_type n) + + Hashed + Associative Container + + Creates an empty sparse_hash_set that's optimized for holding + up to n items. + [3] +
+ sparse_hash_set(size_type n, const hasher& h) + + Hashed + Associative Container + + Creates an empty sparse_hash_set that's optimized for up + to n items, using h as the hash function. +
+ sparse_hash_set(size_type n, const hasher& h, const + key_equal& k) + + Hashed + Associative Container + + Creates an empty sparse_hash_set that's optimized for up + to n items, using h as the hash function and + k as the key equal function. +
+
template <class InputIterator>
+sparse_hash_set(InputIterator f, InputIterator l) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a sparse_hash_set with a copy of a range. +
+
template <class InputIterator>
+sparse_hash_set(InputIterator f, InputIterator l, size_type n) 
+[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized to + hold up to n items. +
+
template <class InputIterator>
+sparse_hash_set(InputIterator f, InputIterator l, size_type n, const
+hasher& h) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized to hold + up to n items, using h as the hash function. +
+
template <class InputIterator>
+sparse_hash_set(InputIterator f, InputIterator l, size_type n, const
+hasher& h, const key_equal& k) 
[2] +
+ Unique + Hashed Associative Container + + Creates a hash_set with a copy of a range that's optimized for + holding up to n items, using h as the hash + function and k as the key equal function. +
+ sparse_hash_set(const hash_set&) + + Container + + The copy constructor. +
+ sparse_hash_set& operator=(const hash_set&) + + Container + + The assignment operator +
+ void swap(hash_set&) + + Container + + Swaps the contents of two hash_sets. +
+
pair<iterator, bool> insert(const value_type& x)
+
+
+ Unique + Associative Container + + Inserts x into the sparse_hash_set. +
+
template <class InputIterator>
+void insert(InputIterator f, InputIterator l) 
[2] +
+ Unique + Associative Container + + Inserts a range into the sparse_hash_set. +
+ void set_deleted_key(const key_type& key) [4] + + sparse_hash_set + + See below. +
+ void clear_deleted_key() [4] + + sparse_hash_set + + See below. +
+ void erase(iterator pos) + + Associative + Container + + Erases the element pointed to by pos. + [4] +
+ size_type erase(const key_type& k) + + Associative + Container + + Erases the element whose key is k. + [4] +
+ void erase(iterator first, iterator last) + + Associative + Container + + Erases all elements in a range. + [4] +
+ void clear() + + Associative + Container + + Erases all of the elements. +
+ iterator find(const key_type& k) const + + Associative + Container + + Finds an element whose key is k. +
+ size_type count(const key_type& k) const + + Unique + Associative Container + + Counts the number of elements whose key is k. +
+
pair<iterator, iterator> equal_range(const
+key_type& k) const
+
+ Associative + Container + + Finds a range containing all elements whose key is k. +
+ bool write_metadata(FILE *fp) + + sparse_hash_set + + See below. +
+ bool read_metadata(FILE *fp) + + sparse_hash_set + + See below. +
+ bool write_nopointer_data(FILE *fp) + + sparse_hash_set + + See below. +
+ bool read_nopointer_data(FILE *fp) + + sparse_hash_set + + See below. +
+
bool operator==(const hash_set&, const hash_set&)
+
+
+ Hashed + Associative Container + + Tests two hash_sets for equality. This is a global function, not a + member function. +
+ + +

New members

+ +These members are not defined in the Unique +Hashed Associative Container, Simple +Associative Container, or tr1's Unordered Associative +Container requirements, but are specific to +sparse_hash_set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDescription
+ void set_deleted_key(const key_type& key) + + Sets the distinguished "deleted" key to key. This must be + called before any calls to erase(). [4] +
+ void clear_deleted_key() + + Clears the distinguished "deleted" key. After this is called, + calls to erase() are not valid on this object. + [4] +
+ void set_resizing_parameters(float shrink, float grow) + + This function is DEPRECATED. It is equivalent to calling + min_load_factor(shrink); max_load_factor(grow). +
+ bool write_metadata(FILE *fp) + + Write hashtable metadata to fp. See below. +
+ bool read_metadata(FILE *fp) + + Read hashtable metadata from fp. See below. +
+ bool write_nopointer_data(FILE *fp) + + Write hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ bool read_nopointer_data(FILE *fp) + + Read hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ + +

Notes

+ +

[1] + +This member function relies on member template functions, which +may not be supported by all compilers. If your compiler supports +member templates, you can call this function with any type of input +iterator. If your compiler does not yet support member templates, +though, then the arguments must either be of type const +value_type* or of type sparse_hash_set::const_iterator.

+ +

[2] + +In order to preserve iterators, erasing hashtable elements does not +cause a hashtable to resize. This means that after a string of +erase() calls, the hashtable will use more space than is +required. At a cost of invalidating all current iterators, you can +call resize() to manually compact the hashtable. The +hashtable promotes too-small resize() arguments to the +smallest legal value, so to compact a hashtable, it's sufficient to +call resize(0). + +

[3] + +Unlike some other hashtable implementations, the optional n in +the calls to the constructor, resize, and rehash +indicates not the desired number of buckets that +should be allocated, but instead the expected number of items to be +inserted. The class then sizes the hash-set appropriately for the +number of items specified. It's not an error to actually insert more +or fewer items into the hashtable, but the implementation is most +efficient -- does the fewest hashtable resizes -- if the number of +inserted items is n or slightly less.

+ +

[4] + +sparse_hash_set requires you call +set_deleted_key() before calling erase(). (This is +the largest difference between the sparse_hash_set API and +other hash-set APIs. See implementation.html +for why this is necessary.) +The argument to set_deleted_key() should be a key-value that +is never used for legitimate hash-set entries. It is an error to call +erase() without first calling set_deleted_key(), and +it is also an error to call insert() with an item whose key +is the "deleted key."

+ +

There is no need to call set_deleted_key if you do not +wish to call erase() on the hash-set.

+ +

It is acceptable to change the deleted-key at any time by calling +set_deleted_key() with a new argument. You can also call +clear_deleted_key(), at which point all keys become valid for +insertion but no hashtable entries can be deleted until +set_deleted_key() is called again.

+ + +

Input/Output

+ +

It is possible to save and restore sparse_hash_set objects +to disk. Storage takes place in two steps. The first writes the +hashtable metadata. The second writes the actual data.

+ +

To write a hashtable to disk, first call write_metadata() +on an open file pointer. This saves the hashtable information in a +byte-order-independent format.

+ +

After the metadata has been written to disk, you must write the +actual data stored in the hash-set to disk. If both the key and data +are "simple" enough, you can do this by calling +write_nopointer_data(). "Simple" data is data that can be +safely copied to disk via fwrite(). Native C data types fall +into this category, as do structs of native C data types. Pointers +and STL objects do not.

+ +

Note that write_nopointer_data() does not do any endian +conversion. Thus, it is only appropriate when you intend to read the +data on the same endian architecture as you write the data.

+ +

If you cannot use write_nopointer_data() for any reason, +you can write the data yourself by iterating over the +sparse_hash_set with a const_iterator and writing +the key and data in any manner you wish.

+ +

To read the hashtable information from disk, first you must create +a sparse_hash_set object. Then open a file pointer to point +to the saved hashtable, and call read_metadata(). If you +saved the data via write_nopointer_data(), you can follow the +read_metadata() call with a call to +read_nopointer_data(). This is all that is needed.

+ +

If you saved the data through a custom write routine, you must call +a custom read routine to read in the data. To do this, iterate over +the sparse_hash_set with an iterator; this operation +is sensical because the metadata has already been set up. For each +iterator item, you can read the key and value from disk, and set it +appropriately. You will need to do a const_cast on the +iterator, since *it is always const. The +code might look like this:

+
+   for (sparse_hash_set<int*>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       const_cast<int*>(*it) = new int;
+       fread(const_cast<int*>(*it), sizeof(int), 1, fp);
+   }
+
+ +

Here's another example, where the item stored in the hash-set is +a C++ object with a non-trivial constructor. In this case, you must +use "placement new" to construct the object at the correct memory +location.

+
+   for (sparse_hash_set<ComplicatedClass>::iterator it = ht.begin();
+        it != ht.end(); ++it) {
+       int ctor_arg;  // ComplicatedClass takes an int as its constructor arg
+       fread(&ctor_arg, sizeof(int), 1, fp);
+       new (const_cast<ComplicatedClass*>(&(*it))) ComplicatedClass(ctor_arg);
+   }
+
+ + +

Validity of Iterators

+ +

erase() is guaranteed not to invalidate any iterators -- +except for any iterators pointing to the item being erased, of course. +insert() invalidates all iterators, as does +resize().

+ +

This is implemented by making erase() not resize the +hashtable. If you desire maximum space efficiency, you can call +resize(0) after a string of erase() calls, to force +the hashtable to resize to the smallest possible size.

+ +

In addition to invalidating iterators, insert() +and resize() invalidate all pointers into the hashtable. If +you want to store a pointer to an object held in a sparse_hash_set, +either do so after finishing hashtable inserts, or store the object on +the heap and a pointer to it in the sparse_hash_set.

+ + +

See also

+ +

The following are SGI STL, and some Google STL, concepts and +classes related to sparse_hash_set.

+ +hash_set, +Associative Container, +Hashed Associative Container, +Simple Associative Container, +Unique Hashed Associative Container, +set, +map +multiset, +multimap, +hash_map, +hash_multiset, +hash_multimap, +sparsetable, +sparse_hash_map, +dense_hash_set, +dense_hash_map + + + diff --git a/src/sparsehash-1.6/doc/sparsetable.html b/src/sparsehash-1.6/doc/sparsetable.html new file mode 100644 index 0000000..d8c8364 --- /dev/null +++ b/src/sparsehash-1.6/doc/sparsetable.html @@ -0,0 +1,1393 @@ + + + + + +sparsetable<T, GROUP_SIZE> + + + + +

[Note: this document is formatted similarly to the SGI STL +implementation documentation pages, and refers to concepts and classes +defined there. However, neither this document nor the code it +describes is associated with SGI, nor is it necessary to have SGI's +STL implementation installed in order to use this class.]

+ +

sparsetable<T, GROUP_SIZE>

+ +

A sparsetable is a Random +Access Container that supports constant time random access to +elements, and constant time insertion and removal of elements. It +implements the "array" or "table" abstract data type. The number of +elements in a sparsetable is set at constructor time, though +you can change it at any time by calling resize().

+ +

sparsetable is distinguished from other array +implementations, including the default C implementation, in its stingy +use of memory -- in particular, unused array elements require only 1 bit +of disk space to store, rather than sizeof(T) bytes -- and by +the ability to save and restore contents to disk. On the other hand, +this array implementation, while still efficient, is slower than other +array implementations.

+ + +

A sparsetable distinguishes between table elements that +have been assigned and those that are unassigned. +Assigned table elements are those that have had a value set via +set(), operator(), assignment via an iterator, and +so forth. Unassigned table elements are those that have not had a +value set in one of these ways, or that have been explicitly +unassigned via a call to erase() or clear(). Lookup +is valid on both assigned and unassigned table elements; for +unassigned elements, lookup returns the default value +T().

+
+ +

This class is appropriate for applications that need to store large +arrays in memory, or for applications that need these arrays to be +persistent.

+ + +

Example

+ +
+#include <google/sparsetable>
+
+using google::sparsetable;      // namespace where class lives by default
+
+sparsetable<int> t(100);
+t[5] = 6;
+cout << "t[5] = " << t[5];
+cout << "Default value = " << t[99];
+
+ + +

Definition

+ +Defined in the header sparsetable. This +class is not part of the C++ standard. + + +

Template parameters

+ + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
+ T + + The sparsetable's value type: the type of object that is stored in + the table. + +   +
+ GROUP_SIZE + + The number of elements in each sparsetable group (see the implementation doc for more details + on this value). This almost never need be specified; the default + template parameter value works well in all situations. + +   +
+ + +

Model of

+ +Random Access Container + + +

Type requirements

+ +None, except for those imposed by the requirements of +Random +Access Container + + +

Public base classes

+ +None. + + +

Members

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberWhere definedDescription
+ value_type + + Container + + The type of object, T, stored in the table. +
+ pointer + + Container + + Pointer to T. +
+ reference + + Container + + Reference to T. +
+ const_reference + + Container + + Const reference to T. +
+ size_type + + Container + + An unsigned integral type. +
+ difference_type + + Container + + A signed integral type. +
+ iterator + + Container + + Iterator used to iterate through a sparsetable. +
+ const_iterator + + Container + + Const iterator used to iterate through a sparsetable. +
+ reverse_iterator + + Reversible + Container + + Iterator used to iterate backwards through a sparsetable. +
+ const_reverse_iterator + + Reversible + Container + + Const iterator used to iterate backwards through a + sparsetable. +
+ nonempty_iterator + + sparsetable + + Iterator used to iterate through the + assigned elements of the + sparsetable. +
+ const_nonempty_iterator + + sparsetable + + Const iterator used to iterate through the + assigned elements of the + sparsetable. +
+ reverse_nonempty_iterator + + sparsetable + + Iterator used to iterate backwards through the + assigned elements of the + sparsetable. +
+ const_reverse_nonempty_iterator + + sparsetable + + Const iterator used to iterate backwards through the + assigned elements of the + sparsetable. +
+ destructive_iterator + + sparsetable + + Iterator used to iterate through the + assigned elements of the + sparsetable, erasing elements as it iterates. + [1] +
+ iterator begin() + + Container + + Returns an iterator pointing to the beginning of the + sparsetable. +
+ iterator end() + + Container + + Returns an iterator pointing to the end of the + sparsetable. +
+ const_iterator begin() const + + Container + + Returns an const_iterator pointing to the beginning of the + sparsetable. +
+ const_iterator end() const + + Container + + Returns an const_iterator pointing to the end of the + sparsetable. +
+ reverse_iterator rbegin() + + Reversible + Container + + Returns a reverse_iterator pointing to the beginning of the + reversed sparsetable. +
+ reverse_iterator rend() + + Reversible + Container + + Returns a reverse_iterator pointing to the end of the + reversed sparsetable. +
+ const_reverse_iterator rbegin() const + + Reversible + Container + + Returns a const_reverse_iterator pointing to the beginning + of the reversed sparsetable. +
+ const_reverse_iterator rend() const + + Reversible + Container + + Returns a const_reverse_iterator pointing to the end of + the reversed sparsetable. +
+ nonempty_iterator nonempty_begin() + + sparsetable + + Returns a nonempty_iterator pointing to the first + assigned element of the + sparsetable. +
+ nonempty_iterator nonempty_end() + + sparsetable + + Returns a nonempty_iterator pointing to the end of the + sparsetable. +
+ const_nonempty_iterator nonempty_begin() const + + sparsetable + + Returns a const_nonempty_iterator pointing to the first + assigned element of the + sparsetable. +
+ const_nonempty_iterator nonempty_end() const + + sparsetable + + Returns a const_nonempty_iterator pointing to the end of + the sparsetable. +
+ reverse_nonempty_iterator nonempty_rbegin() + + sparsetable + + Returns a reverse_nonempty_iterator pointing to the first + assigned element of the reversed + sparsetable. +
+ reverse_nonempty_iterator nonempty_rend() + + sparsetable + + Returns a reverse_nonempty_iterator pointing to the end of + the reversed sparsetable. +
+ const_reverse_nonempty_iterator nonempty_rbegin() const + + sparsetable + + Returns a const_reverse_nonempty_iterator pointing to the + first assigned element of the reversed + sparsetable. +
+ const_reverse_nonempty_iterator nonempty_rend() const + + sparsetable + + Returns a const_reverse_nonempty_iterator pointing to the + end of the reversed sparsetable. +
+ destructive_iterator destructive_begin() + + sparsetable + + Returns a destructive_iterator pointing to the first + assigned element of the + sparsetable. +
+ destructive_iterator destructive_end() + + sparsetable + + Returns a destructive_iterator pointing to the end of + the sparsetable. +
+ size_type size() const + + Container + + Returns the size of the sparsetable. +
+ size_type max_size() const + + Container + + Returns the largest possible size of the sparsetable. +
+ bool empty() const + + Container + + true if the sparsetable's size is 0. +
+ size_type num_nonempty() const + + sparsetable + + Returns the number of sparsetable elements that are currently assigned. +
+ sparsetable(size_type n) + + Container + + Creates a sparsetable with n elements. +
+ sparsetable(const sparsetable&) + + Container + + The copy constructor. +
+ ~sparsetable() + + Container + + The destructor. +
+ sparsetable& operator=(const sparsetable&) + + Container + + The assignment operator +
+ void swap(sparsetable&) + + Container + + Swaps the contents of two sparsetables. +
+ reference operator[](size_type n) + + Random + Access Container + + Returns the n'th element. [2] +
+ const_reference operator[](size_type n) const + + Random + Access Container + + Returns the n'th element. +
+ bool test(size_type i) const + + sparsetable + + true if the i'th element of the sparsetable is assigned. +
+ bool test(iterator pos) const + + sparsetable + + true if the sparsetable element pointed to by pos + is assigned. +
+ bool test(const_iterator pos) const + + sparsetable + + true if the sparsetable element pointed to by pos + is assigned. +
+ const_reference get(size_type i) const + + sparsetable + + returns the i'th element of the sparsetable. +
+ reference set(size_type i, const_reference val) + + sparsetable + + Sets the i'th element of the sparsetable to value + val. +
+ void erase(size_type i) + + sparsetable + + Erases the i'th element of the sparsetable. +
+ void erase(iterator pos) + + sparsetable + + Erases the element of the sparsetable pointed to by + pos. +
+ void erase(iterator first, iterator last) + + sparsetable + + Erases the elements of the sparsetable in the range + [first, last). +
+ void clear() + + sparsetable + + Erases all of the elements. +
+ void resize(size_type n) + + sparsetable + + Changes the size of sparsetable to n. +
+ bool write_metadata(FILE *fp) + + sparsetable + + See below. +
+ bool read_metadata(FILE *fp) + + sparsetable + + See below. +
+ bool write_nopointer_data(FILE *fp) + + sparsetable + + See below. +
+ bool read_nopointer_data(FILE *fp) + + sparsetable + + See below. +
+
bool operator==(const sparsetable&, const sparsetable&)
+
+
+ Forward + Container + + Tests two sparsetables for equality. This is a global function, + not a member function. +
+
bool operator<(const sparsetable&, const sparsetable&)
+
+
+ Forward + Container + + Lexicographical comparison. This is a global function, + not a member function. +
+ + +

New members

+ +These members are not defined in the Random +Access Container requirement, but are specific to +sparsetable. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDescription
+ nonempty_iterator + + Iterator used to iterate through the + assigned elements of the + sparsetable. +
+ const_nonempty_iterator + + Const iterator used to iterate through the + assigned elements of the + sparsetable. +
+ reverse_nonempty_iterator + + Iterator used to iterate backwards through the + assigned elements of the + sparsetable. +
+ const_reverse_nonempty_iterator + + Const iterator used to iterate backwards through the + assigned elements of the + sparsetable. +
+ destructive_iterator + + Iterator used to iterate through the + assigned elements of the + sparsetable, erasing elements as it iterates. + [1] +
+ nonempty_iterator nonempty_begin() + + Returns a nonempty_iterator pointing to the first + assigned element of the + sparsetable. +
+ nonempty_iterator nonempty_end() + + Returns a nonempty_iterator pointing to the end of the + sparsetable. +
+ const_nonempty_iterator nonempty_begin() const + + Returns a const_nonempty_iterator pointing to the first + assigned element of the + sparsetable. +
+ const_nonempty_iterator nonempty_end() const + + Returns a const_nonempty_iterator pointing to the end of + the sparsetable. +
+ reverse_nonempty_iterator nonempty_rbegin() + + Returns a reverse_nonempty_iterator pointing to the first + assigned element of the reversed + sparsetable. +
+ reverse_nonempty_iterator nonempty_rend() + + Returns a reverse_nonempty_iterator pointing to the end of + the reversed sparsetable. +
+ const_reverse_nonempty_iterator nonempty_rbegin() const + + Returns a const_reverse_nonempty_iterator pointing to the + first assigned element of the reversed + sparsetable. +
+ const_reverse_nonempty_iterator nonempty_rend() const + + Returns a const_reverse_nonempty_iterator pointing to the + end of the reversed sparsetable. +
+ destructive_iterator destructive_begin() + + Returns a destructive_iterator pointing to the first + assigned element of the + sparsetable. +
+ destructive_iterator destructive_end() + + Returns a destructive_iterator pointing to the end of + the sparsetable. +
+ size_type num_nonempty() const + + Returns the number of sparsetable elements that are currently assigned. +
+ bool test(size_type i) const + + true if the i'th element of the sparsetable is assigned. +
+ bool test(iterator pos) const + + true if the sparsetable element pointed to by pos + is assigned. +
+ bool test(const_iterator pos) const + + true if the sparsetable element pointed to by pos + is assigned. +
+ const_reference get(size_type i) const + + returns the i'th element of the sparsetable. If + the i'th element is assigned, the + assigned value is returned, otherwise, the default value + T() is returned. +
+ reference set(size_type i, const_reference val) + + Sets the i'th element of the sparsetable to value + val, and returns a reference to the i'th element + of the table. This operation causes the i'th element to + be assigned. +
+ void erase(size_type i) + + Erases the i'th element of the sparsetable. This + operation causes the i'th element to be unassigned. +
+ void erase(iterator pos) + + Erases the element of the sparsetable pointed to by + pos. This operation causes the i'th element to + be unassigned. +
+ void erase(iterator first, iterator last) + + Erases the elements of the sparsetable in the range + [first, last). This operation causes these elements to + be unassigned. +
+ void clear() + + Erases all of the elements. This causes all elements to be + unassigned. +
+ void resize(size_type n) + + Changes the size of sparsetable to n. If n is + greater than the old size, new, unassigned + elements are appended. If n is less than the old size, + all elements in position >n are deleted. +
+ bool write_metadata(FILE *fp) + + Write hashtable metadata to fp. See below. +
+ bool read_metadata(FILE *fp) + + Read hashtable metadata from fp. See below. +
+ bool write_nopointer_data(FILE *fp) + + Write hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ bool read_nopointer_data(FILE *fp) + + Read hashtable contents to fp. This is valid only if the + hashtable key and value are "plain" data. See below. +
+ + +

Notes

+ +

[1] + +sparsetable::destructive_iterator iterates through a +sparsetable like a normal iterator, but ++it may delete the +element being iterated past. Obviously, this iterator can only be +used once on a given table! One application of this iterator is to +copy data from a sparsetable to some other data structure without +using extra memory to store the data in both places during the +copy.

+ +

[2] + +Since operator[] might insert a new element into the +sparsetable, it can't possibly be a const member +function. In theory, since it might insert a new element, it should +cause the element it refers to to become assigned. However, this is undesirable when +operator[] is used to examine elements, rather than assign +them. Thus, as an implementation trick, operator[] does not +really return a reference. Instead it returns an object that +behaves almost exactly like a reference. This object, +however, delays setting the appropriate sparsetable element to assigned to when it is actually assigned to.

+ +

For a bit more detail: the object returned by operator[] +is an opaque type which defines operator=, operator +reference(), and operator&. The first operator controls +assigning to the value. The second controls examining the value. The +third controls pointing to the value.

+ +

All three operators perform exactly as an object of type +reference would perform. The only problems that arise is +when this object is accessed in situations where C++ cannot do the +conversion by default. By far the most common situation is with +variadic functions such as printf. In such situations, you +may need to manually cast the object to the right type:

+
+   printf("%d", static_cast<typename table::reference>(table[i]));
+
+ + +

Input/Output

+ +

It is possible to save and restore sparsetable objects +to disk. Storage takes place in two steps. The first writes the +table metadata. The second writes the actual data.

+ +

To write a sparsetable to disk, first call write_metadata() +on an open file pointer. This saves the sparsetable information in a +byte-order-independent format.

+ +

After the metadata has been written to disk, you must write the +actual data stored in the sparsetable to disk. If the value is +"simple" enough, you can do this by calling +write_nopointer_data(). "Simple" data is data that can be +safely copied to disk via fwrite(). Native C data types fall +into this category, as do structs of native C data types. Pointers +and STL objects do not.

+ +

Note that write_nopointer_data() does not do any endian +conversion. Thus, it is only appropriate when you intend to read the +data on the same endian architecture as you write the data.

+ +

If you cannot use write_nopointer_data() for any reason, +you can write the data yourself by iterating over the +sparsetable with a const_nonempty_iterator and +writing the key and data in any manner you wish.

+ +

To read the hashtable information from disk, first you must create +a sparsetable object. Then open a file pointer to point +to the saved sparsetable, and call read_metadata(). If you +saved the data via write_nopointer_data(), you can follow the +read_metadata() call with a call to +read_nopointer_data(). This is all that is needed.

+ +

If you saved the data through a custom write routine, you must call +a custom read routine to read in the data. To do this, iterate over +the sparsetable with a nonempty_iterator; this +operation is sensical because the metadata has already been set up. +For each iterator item, you can read the key and value from disk, and +set it appropriately. The code might look like this:

+
+   for (sparsetable<int*>::nonempty_iterator it = t.nonempty_begin();
+        it != t.nonempty_end(); ++it) {
+       *it = new int;
+       fread(*it, sizeof(int), 1, fp);
+   }
+
+ +

Here's another example, where the item stored in the sparsetable is +a C++ object with a non-trivial constructor. In this case, you must +use "placement new" to construct the object at the correct memory +location.

+
+   for (sparsetable<ComplicatedCppClass>::nonempty_iterator it = t.nonempty_begin();
+        it != t.nonempty_end(); ++it) {
+       int constructor_arg;   // ComplicatedCppClass takes an int to construct
+       fread(&constructor_arg, sizeof(int), 1, fp);
+       new (&(*it)) ComplicatedCppClass(constructor_arg);     // placement new
+   }
+
+ + +

See also

+ +

The following are SGI STL concepts and classes related to +sparsetable.

+ +Container, +Random Access Container, +sparse_hash_set, +sparse_hash_map + + + diff --git a/src/sparsehash-1.6/experimental/Makefile b/src/sparsehash-1.6/experimental/Makefile new file mode 100644 index 0000000..aa997f7 --- /dev/null +++ b/src/sparsehash-1.6/experimental/Makefile @@ -0,0 +1,9 @@ +example: example.o libchash.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ + +.SUFFIXES: .c .o .h +.c.o: + $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< + +example.o: example.c libchash.h +libchash.o: libchash.c libchash.h diff --git a/src/sparsehash-1.6/experimental/README b/src/sparsehash-1.6/experimental/README new file mode 100644 index 0000000..150161d --- /dev/null +++ b/src/sparsehash-1.6/experimental/README @@ -0,0 +1,14 @@ +This is a C version of sparsehash (and also, maybe, densehash) that I +wrote way back when, and served as the inspiration for the C++ +version. The API for the C version is much uglier than the C++, +because of the lack of template support. I believe the class works, +but I'm not convinced it's really flexible or easy enough to use. + +It would be nice to rework this C class to follow the C++ API as +closely as possible (eg have a set_deleted_key() instead of using a +#define like this code does now). I believe the code compiles and +runs, if anybody is interested in using it now, but it's subject to +major change in the future, as people work on it. + +Craig Silverstein +20 March 2005 diff --git a/src/sparsehash-1.6/experimental/example.c b/src/sparsehash-1.6/experimental/example.c new file mode 100644 index 0000000..38a3265 --- /dev/null +++ b/src/sparsehash-1.6/experimental/example.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include "libchash.h" + +static void TestInsert() { + struct HashTable* ht; + HTItem* bck; + + ht = AllocateHashTable(1, 0); /* value is 1 byte, 0: don't copy keys */ + + HashInsert(ht, PTR_KEY(ht, "January"), 31); /* 0: don't overwrite old val */ + bck = HashInsert(ht, PTR_KEY(ht, "February"), 28); + bck = HashInsert(ht, PTR_KEY(ht, "March"), 31); + + bck = HashFind(ht, PTR_KEY(ht, "February")); + assert(bck); + assert(bck->data == 28); + + FreeHashTable(ht); +} + +static void TestFindOrInsert() { + struct HashTable* ht; + int i; + int iterations = 1000000; + int range = 30; /* random number between 1 and 30 */ + + ht = AllocateHashTable(4, 0); /* value is 4 bytes, 0: don't copy keys */ + + /* We'll test how good rand() is as a random number generator */ + for (i = 0; i < iterations; ++i) { + int key = rand() % range; + HTItem* bck = HashFindOrInsert(ht, key, 0); /* initialize to 0 */ + bck->data++; /* found one more of them */ + } + + for (i = 0; i < range; ++i) { + HTItem* bck = HashFind(ht, i); + if (bck) { + printf("%3d: %d\n", bck->key, bck->data); + } else { + printf("%3d: 0\n", i); + } + } + + FreeHashTable(ht); +} + +int main(int argc, char** argv) { + TestInsert(); + TestFindOrInsert(); + return 0; +} diff --git a/src/sparsehash-1.6/experimental/libchash.c b/src/sparsehash-1.6/experimental/libchash.c new file mode 100644 index 0000000..eff9eeb --- /dev/null +++ b/src/sparsehash-1.6/experimental/libchash.c @@ -0,0 +1,1537 @@ +/* Copyright (c) 1998 - 2005, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Craig Silverstein + * + * This library is intended to be used for in-memory hash tables, + * though it provides rudimentary permanent-storage capabilities. + * It attempts to be fast, portable, and small. The best algorithm + * to fulfill these goals is an internal probing hashing algorithm, + * as in Knuth, _Art of Computer Programming_, vol III. Unlike + * chained (open) hashing, it doesn't require a pointer for every + * item, yet it is still constant time lookup in practice. + * + * Also to save space, we let the contents (both data and key) that + * you insert be a union: if the key/data is small, we store it + * directly in the hashtable, otherwise we store a pointer to it. + * To keep you from having to figure out which, use KEY_PTR and + * PTR_KEY to convert between the arguments to these functions and + * a pointer to the real data. For instance: + * char key[] = "ab", *key2; + * HTItem *bck; HashTable *ht; + * HashInsert(ht, PTR_KEY(ht, key), 0); + * bck = HashFind(ht, PTR_KEY(ht, "ab")); + * key2 = KEY_PTR(ht, bck->key); + * + * There are a rich set of operations supported: + * AllocateHashTable() -- Allocates a hashtable structure and + * returns it. + * cchKey: if it's a positive number, then each key is a + * fixed-length record of that length. If it's 0, + * the key is assumed to be a \0-terminated string. + * fSaveKey: normally, you are responsible for allocating + * space for the key. If this is 1, we make a + * copy of the key for you. + * ClearHashTable() -- Removes everything from a hashtable + * FreeHashTable() -- Frees memory used by a hashtable + * + * HashFind() -- takes a key (use PTR_KEY) and returns the + * HTItem containing that key, or NULL if the + * key is not in the hashtable. + * HashFindLast() -- returns the item found by last HashFind() + * HashFindOrInsert() -- inserts the key/data pair if the key + * is not already in the hashtable, or + * returns the appropraite HTItem if it is. + * HashFindOrInsertItem() -- takes key/data as an HTItem. + * HashInsert() -- adds a key/data pair to the hashtable. What + * it does if the key is already in the table + * depends on the value of SAMEKEY_OVERWRITE. + * HashInsertItem() -- takes key/data as an HTItem. + * HashDelete() -- removes a key/data pair from the hashtable, + * if it's there. RETURNS 1 if it was there, + * 0 else. + * If you use sparse tables and never delete, the full data + * space is available. Otherwise we steal -2 (maybe -3), + * so you can't have data fields with those values. + * HashDeleteLast() -- deletes the item returned by the last Find(). + * + * HashFirstBucket() -- used to iterate over the buckets in a + * hashtable. DON'T INSERT OR DELETE WHILE + * ITERATING! You can't nest iterations. + * HashNextBucket() -- RETURNS NULL at the end of iterating. + * + * HashSetDeltaGoalSize() -- if you're going to insert 1000 items + * at once, call this fn with arg 1000. + * It grows the table more intelligently. + * + * HashSave() -- saves the hashtable to a file. It saves keys ok, + * but it doesn't know how to interpret the data field, + * so if the data field is a pointer to some complex + * structure, you must send a function that takes a + * file pointer and a pointer to the structure, and + * write whatever you want to write. It should return + * the number of bytes written. If the file is NULL, + * it should just return the number of bytes it would + * write, without writing anything. + * If your data field is just an integer, not a + * pointer, just send NULL for the function. + * HashLoad() -- loads a hashtable. It needs a function that takes + * a file and the size of the structure, and expects + * you to read in the structure and return a pointer + * to it. You must do memory allocation, etc. If + * the data is just a number, send NULL. + * HashLoadKeys() -- unlike HashLoad(), doesn't load the data off disk + * until needed. This saves memory, but if you look + * up the same key a lot, it does a disk access each + * time. + * You can't do Insert() or Delete() on hashtables that were loaded + * from disk. + * + * See libchash.h for parameters you can modify. Make sure LOG_WORD_SIZE + * is defined correctly for your machine! (5 for 32 bit words, 6 for 64). + */ + +#include +#include +#include /* for strcmp, memcmp, etc */ +#include /* ULTRIX needs this for in.h */ +#include /* for reading/writing hashtables */ +#include +#include "libchash.h" /* all the types */ + + /* if keys are stored directly but cchKey is less than sizeof(ulong), */ + /* this cuts off the bits at the end */ +char grgKeyTruncMask[sizeof(ulong)][sizeof(ulong)]; +#define KEY_TRUNC(ht, key) \ + ( STORES_PTR(ht) || (ht)->cchKey == sizeof(ulong) \ + ? (key) : ((key) & *(ulong *)&(grgKeyTruncMask[(ht)->cchKey][0])) ) + + /* round num up to a multiple of wordsize. (LOG_WORD_SIZE-3 is in bytes) */ +#define WORD_ROUND(num) ( ((num-1) | ((1<<(LOG_WORD_SIZE-3))-1)) + 1 ) +#define NULL_TERMINATED 0 /* val of cchKey if keys are null-term strings */ + + /* Useful operations we do to keys: compare them, copy them, free them */ + +#define KEY_CMP(ht, key1, key2) ( !STORES_PTR(ht) ? (key1) - (key2) : \ + (key1) == (key2) ? 0 : \ + HashKeySize(ht) == NULL_TERMINATED ? \ + strcmp((char *)key1, (char *)key2) :\ + memcmp((void *)key1, (void *)key2, \ + HashKeySize(ht)) ) + +#define COPY_KEY(ht, keyTo, keyFrom) do \ + if ( !STORES_PTR(ht) || !(ht)->fSaveKeys ) \ + (keyTo) = (keyFrom); /* just copy pointer or info */\ + else if ( (ht)->cchKey == NULL_TERMINATED ) /* copy 0-term.ed str */\ + { \ + (keyTo) = (ulong)HTsmalloc( WORD_ROUND(strlen((char *)(keyFrom))+1) ); \ + strcpy((char *)(keyTo), (char *)(keyFrom)); \ + } \ + else \ + { \ + (keyTo) = (ulong) HTsmalloc( WORD_ROUND((ht)->cchKey) ); \ + memcpy( (char *)(keyTo), (char *)(keyFrom), (ht)->cchKey); \ + } \ + while ( 0 ) + +#define FREE_KEY(ht, key) do \ + if ( STORES_PTR(ht) && (ht)->fSaveKeys ) \ + if ( (ht)->cchKey == NULL_TERMINATED ) \ + HTfree((char *)(key), WORD_ROUND(strlen((char *)(key))+1)); \ + else \ + HTfree((char *)(key), WORD_ROUND((ht)->cchKey)); \ + while ( 0 ) + + /* the following are useful for bitmaps */ + /* Format is like this (if 1 word = 4 bits): 3210 7654 ba98 fedc ... */ +typedef ulong HTBitmapPart; /* this has to be unsigned, for >> */ +typedef HTBitmapPart HTBitmap[1<> LOG_WORD_SIZE) << (LOG_WORD_SIZE-3) ) +#define MOD2(i, logmod) ( (i) & ((1<<(logmod))-1) ) +#define DIV_NUM_ENTRIES(i) ( (i) >> LOG_WORD_SIZE ) +#define MOD_NUM_ENTRIES(i) ( MOD2(i, LOG_WORD_SIZE) ) +#define MODBIT(i) ( ((ulong)1) << MOD_NUM_ENTRIES(i) ) + +#define TEST_BITMAP(bm, i) ( (bm)[DIV_NUM_ENTRIES(i)] & MODBIT(i) ? 1 : 0 ) +#define SET_BITMAP(bm, i) (bm)[DIV_NUM_ENTRIES(i)] |= MODBIT(i) +#define CLEAR_BITMAP(bm, i) (bm)[DIV_NUM_ENTRIES(i)] &= ~MODBIT(i) + + /* the following are useful for reading and writing hashtables */ +#define READ_UL(fp, data) \ + do { \ + long _ul; \ + fread(&_ul, sizeof(_ul), 1, (fp)); \ + data = ntohl(_ul); \ + } while (0) + +#define WRITE_UL(fp, data) \ + do { \ + long _ul = htonl((long)(data)); \ + fwrite(&_ul, sizeof(_ul), 1, (fp)); \ + } while (0) + + /* Moves data from disk to memory if necessary. Note dataRead cannot be * + * NULL, because then we might as well (and do) load the data into memory */ +#define LOAD_AND_RETURN(ht, loadCommand) /* lC returns an HTItem * */ \ + if ( !(ht)->fpData ) /* data is stored in memory */ \ + return (loadCommand); \ + else /* must read data off of disk */ \ + { \ + int cchData; \ + HTItem *bck; \ + if ( (ht)->bckData.data ) free((char *)(ht)->bckData.data); \ + ht->bckData.data = (ulong)NULL; /* needed if loadCommand fails */ \ + bck = (loadCommand); \ + if ( bck == NULL ) /* loadCommand failed: key not found */ \ + return NULL; \ + else \ + (ht)->bckData = *bck; \ + fseek(ht->fpData, (ht)->bckData.data, SEEK_SET); \ + READ_UL((ht)->fpData, cchData); \ + (ht)->bckData.data = (ulong)(ht)->dataRead((ht)->fpData, cchData); \ + return &((ht)->bckData); \ + } + + +/* ======================================================================== */ +/* UTILITY ROUTINES */ +/* ---------------------- */ + +/* HTsmalloc() -- safe malloc + * allocates memory, or crashes if the allocation fails. + */ +static void *HTsmalloc(unsigned long size) +{ + void *retval; + + if ( size == 0 ) + return NULL; + retval = (void *)malloc(size); + if ( !retval ) + { + fprintf(stderr, "HTsmalloc: Unable to allocate %lu bytes of memory\n", + size); + exit(1); + } + return retval; +} + +/* HTscalloc() -- safe calloc + * allocates memory and initializes it to 0, or crashes if + * the allocation fails. + */ +static void *HTscalloc(unsigned long size) +{ + void *retval; + + retval = (void *)calloc(size, 1); + if ( !retval && size > 0 ) + { + fprintf(stderr, "HTscalloc: Unable to allocate %lu bytes of memory\n", + size); + exit(1); + } + return retval; +} + +/* HTsrealloc() -- safe calloc + * grows the amount of memory from a source, or crashes if + * the allocation fails. + */ +static void *HTsrealloc(void *ptr, unsigned long new_size, long delta) +{ + if ( ptr == NULL ) + return HTsmalloc(new_size); + ptr = realloc(ptr, new_size); + if ( !ptr && new_size > 0 ) + { + fprintf(stderr, "HTsrealloc: Unable to reallocate %lu bytes of memory\n", + new_size); + exit(1); + } + return ptr; +} + +/* HTfree() -- keep track of memory use + * frees memory using free, but updates count of how much memory + * is being used. + */ +static void HTfree(void *ptr, unsigned long size) +{ + if ( size > 0 ) /* some systems seem to not like freeing NULL */ + free(ptr); +} + +/*************************************************************************\ +| HTcopy() | +| Sometimes we interpret data as a ulong. But ulongs must be | +| aligned on some machines, so instead of casting we copy. | +\*************************************************************************/ + +unsigned long HTcopy(char *ul) +{ + unsigned long retval; + + memcpy(&retval, ul, sizeof(retval)); + return retval; +} + +/*************************************************************************\ +| HTSetupKeyTrunc() | +| If keys are stored directly but cchKey is less than | +| sizeof(ulong), this cuts off the bits at the end. | +\*************************************************************************/ + +static void HTSetupKeyTrunc(void) +{ + int i, j; + + for ( i = 0; i < sizeof(unsigned long); i++ ) + for ( j = 0; j < sizeof(unsigned long); j++ ) + grgKeyTruncMask[i][j] = j < i ? 255 : 0; /* chars have 8 bits */ +} + + +/* ======================================================================== */ +/* TABLE ROUTINES */ +/* -------------------- */ + +/* The idea is that a hashtable with (logically) t buckets is divided + * into t/M groups of M buckets each. (M is a constant set in + * LOG_BM_WORDS for efficiency.) Each group is stored sparsely. + * Thus, inserting into the table causes some array to grow, which is + * slow but still constant time. Lookup involves doing a + * logical-position-to-sparse-position lookup, which is also slow but + * constant time. The larger M is, the slower these operations are + * but the less overhead (slightly). + * + * To store the sparse array, we store a bitmap B, where B[i] = 1 iff + * bucket i is non-empty. Then to look up bucket i we really look up + * array[# of 1s before i in B]. This is constant time for fixed M. + * + * Terminology: the position of an item in the overall table (from + * 1 .. t) is called its "location." The logical position in a group + * (from 1 .. M ) is called its "position." The actual location in + * the array (from 1 .. # of non-empty buckets in the group) is + * called its "offset." + * + * The following operations are supported: + * o Allocate an array with t buckets, all empty + * o Free a array (but not whatever was stored in the buckets) + * o Tell whether or not a bucket is empty + * o Return a bucket with a given location + * o Set the value of a bucket at a given location + * o Iterate through all the buckets in the array + * o Read and write an occupancy bitmap to disk + * o Return how much memory is being allocated by the array structure + */ + +#ifndef SparseBucket /* by default, each bucket holds an HTItem */ +#define SparseBucket HTItem +#endif + +typedef struct SparseBin { + SparseBucket *binSparse; + HTBitmap bmOccupied; /* bmOccupied[i] is 1 if bucket i has an item */ + short cOccupied; /* size of binSparse; useful for iterators, eg */ +} SparseBin; + +typedef struct SparseIterator { + long posGroup; + long posOffset; + SparseBin *binSparse; /* state info, to avoid args for NextBucket() */ + ulong cBuckets; +} SparseIterator; + +#define LOG_LOW_BIN_SIZE ( LOG_BM_WORDS+LOG_WORD_SIZE ) +#define SPARSE_GROUPS(cBuckets) ( (((cBuckets)-1) >> LOG_LOW_BIN_SIZE) + 1 ) + + /* we need a small function to figure out # of items set in the bm */ +static HTOffset EntriesUpto(HTBitmapPart *bm, int i) +{ /* returns # of set bits in 0..i-1 */ + HTOffset retval = 0; + static HTOffset rgcBits[256] = /* # of bits set in one char */ + {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + + if ( i == 0 ) return 0; + for ( ; i > sizeof(*bm)*8; i -= sizeof(*bm)*8, bm++ ) + { /* think of it as loop unrolling */ +#if LOG_WORD_SIZE >= 3 /* 1 byte per word, or more */ + retval += rgcBits[*bm & 255]; /* get the low byte */ +#if LOG_WORD_SIZE >= 4 /* at least 2 bytes */ + retval += rgcBits[(*bm >> 8) & 255]; +#if LOG_WORD_SIZE >= 5 /* at least 4 bytes */ + retval += rgcBits[(*bm >> 16) & 255]; + retval += rgcBits[(*bm >> 24) & 255]; +#if LOG_WORD_SIZE >= 6 /* 8 bytes! */ + retval += rgcBits[(*bm >> 32) & 255]; + retval += rgcBits[(*bm >> 40) & 255]; + retval += rgcBits[(*bm >> 48) & 255]; + retval += rgcBits[(*bm >> 56) & 255]; +#if LOG_WORD_SIZE >= 7 /* not a concern for a while... */ +#error Need to rewrite EntriesUpto to support such big words +#endif /* >8 bytes */ +#endif /* 8 bytes */ +#endif /* 4 bytes */ +#endif /* 2 bytes */ +#endif /* 1 byte */ + } + switch ( i ) { /* from 0 to 63 */ + case 0: + return retval; +#if LOG_WORD_SIZE >= 3 /* 1 byte per word, or more */ + case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: + return (retval + rgcBits[*bm & ((1 << i)-1)]); +#if LOG_WORD_SIZE >= 4 /* at least 2 bytes */ + case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: + return (retval + rgcBits[*bm & 255] + + rgcBits[(*bm >> 8) & ((1 << (i-8))-1)]); +#if LOG_WORD_SIZE >= 5 /* at least 4 bytes */ + case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & ((1 << (i-16))-1)]); + case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & 255] + + rgcBits[(*bm >> 24) & ((1 << (i-24))-1)]); +#if LOG_WORD_SIZE >= 6 /* 8 bytes! */ + case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & 255] + rgcBits[(*bm >> 24) & 255] + + rgcBits[(*bm >> 32) & ((1 << (i-32))-1)]); + case 41: case 42: case 43: case 44: case 45: case 46: case 47: case 48: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & 255] + rgcBits[(*bm >> 24) & 255] + + rgcBits[(*bm >> 32) & 255] + + rgcBits[(*bm >> 40) & ((1 << (i-40))-1)]); + case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & 255] + rgcBits[(*bm >> 24) & 255] + + rgcBits[(*bm >> 32) & 255] + rgcBits[(*bm >> 40) & 255] + + rgcBits[(*bm >> 48) & ((1 << (i-48))-1)]); + case 57: case 58: case 59: case 60: case 61: case 62: case 63: case 64: + return (retval + rgcBits[*bm & 255] + rgcBits[(*bm >> 8) & 255] + + rgcBits[(*bm >> 16) & 255] + rgcBits[(*bm >> 24) & 255] + + rgcBits[(*bm >> 32) & 255] + rgcBits[(*bm >> 40) & 255] + + rgcBits[(*bm >> 48) & 255] + + rgcBits[(*bm >> 56) & ((1 << (i-56))-1)]); +#endif /* 8 bytes */ +#endif /* 4 bytes */ +#endif /* 2 bytes */ +#endif /* 1 byte */ + } + assert("" == "word size is too big in EntriesUpto()"); + return -1; +} +#define SPARSE_POS_TO_OFFSET(bm, i) ( EntriesUpto(&((bm)[0]), i) ) +#define SPARSE_BUCKET(bin, location) \ + ( (bin)[(location) >> LOG_LOW_BIN_SIZE].binSparse + \ + SPARSE_POS_TO_OFFSET((bin)[(location)>>LOG_LOW_BIN_SIZE].bmOccupied, \ + MOD2(location, LOG_LOW_BIN_SIZE)) ) + + +/*************************************************************************\ +| SparseAllocate() | +| SparseFree() | +| Allocates, sets-to-empty, and frees a sparse array. All you need | +| to tell me is how many buckets you want. I return the number of | +| buckets I actually allocated, setting the array as a parameter. | +| Note that you have to set auxilliary parameters, like cOccupied. | +\*************************************************************************/ + +static ulong SparseAllocate(SparseBin **pbinSparse, ulong cBuckets) +{ + int cGroups = SPARSE_GROUPS(cBuckets); + + *pbinSparse = (SparseBin *) HTscalloc(sizeof(**pbinSparse) * cGroups); + return cGroups << LOG_LOW_BIN_SIZE; +} + +static SparseBin *SparseFree(SparseBin *binSparse, ulong cBuckets) +{ + ulong iGroup, cGroups = SPARSE_GROUPS(cBuckets); + + for ( iGroup = 0; iGroup < cGroups; iGroup++ ) + HTfree(binSparse[iGroup].binSparse, (sizeof(*binSparse[iGroup].binSparse) + * binSparse[iGroup].cOccupied)); + HTfree(binSparse, sizeof(*binSparse) * cGroups); + return NULL; +} + +/*************************************************************************\ +| SparseIsEmpty() | +| SparseFind() | +| You give me a location (ie a number between 1 and t), and I | +| return the bucket at that location, or NULL if the bucket is | +| empty. It's OK to call Find() on an empty table. | +\*************************************************************************/ + +static int SparseIsEmpty(SparseBin *binSparse, ulong location) +{ + return !TEST_BITMAP(binSparse[location>>LOG_LOW_BIN_SIZE].bmOccupied, + MOD2(location, LOG_LOW_BIN_SIZE)); +} + +static SparseBucket *SparseFind(SparseBin *binSparse, ulong location) +{ + if ( SparseIsEmpty(binSparse, location) ) + return NULL; + return SPARSE_BUCKET(binSparse, location); +} + +/*************************************************************************\ +| SparseInsert() | +| You give me a location, and contents to put there, and I insert | +| into that location and RETURN a pointer to the location. If | +| bucket was already occupied, I write over the contents only if | +| *pfOverwrite is 1. We set *pfOverwrite to 1 if there was someone | +| there (whether or not we overwrote) and 0 else. | +\*************************************************************************/ + +static SparseBucket *SparseInsert(SparseBin *binSparse, SparseBucket *bckInsert, + ulong location, int *pfOverwrite) +{ + SparseBucket *bckPlace; + HTOffset offset; + + bckPlace = SparseFind(binSparse, location); + if ( bckPlace ) /* means we replace old contents */ + { + if ( *pfOverwrite ) + *bckPlace = *bckInsert; + *pfOverwrite = 1; + return bckPlace; + } + + binSparse += (location >> LOG_LOW_BIN_SIZE); + offset = SPARSE_POS_TO_OFFSET(binSparse->bmOccupied, + MOD2(location, LOG_LOW_BIN_SIZE)); + binSparse->binSparse = (SparseBucket *) + HTsrealloc(binSparse->binSparse, + sizeof(*binSparse->binSparse) * ++binSparse->cOccupied, + sizeof(*binSparse->binSparse)); + memmove(binSparse->binSparse + offset+1, + binSparse->binSparse + offset, + (binSparse->cOccupied-1 - offset) * sizeof(*binSparse->binSparse)); + binSparse->binSparse[offset] = *bckInsert; + SET_BITMAP(binSparse->bmOccupied, MOD2(location, LOG_LOW_BIN_SIZE)); + *pfOverwrite = 0; + return binSparse->binSparse + offset; +} + +/*************************************************************************\ +| SparseFirstBucket() | +| SparseNextBucket() | +| SparseCurrentBit() | +| Iterate through the occupied buckets of a dense hashtable. You | +| must, of course, have allocated space yourself for the iterator. | +\*************************************************************************/ + +static SparseBucket *SparseNextBucket(SparseIterator *iter) +{ + if ( iter->posOffset != -1 && /* not called from FirstBucket()? */ + (++iter->posOffset < iter->binSparse[iter->posGroup].cOccupied) ) + return iter->binSparse[iter->posGroup].binSparse + iter->posOffset; + + iter->posOffset = 0; /* start the next group */ + for ( iter->posGroup++; iter->posGroup < SPARSE_GROUPS(iter->cBuckets); + iter->posGroup++ ) + if ( iter->binSparse[iter->posGroup].cOccupied > 0 ) + return iter->binSparse[iter->posGroup].binSparse; /* + 0 */ + return NULL; /* all remaining groups were empty */ +} + +static SparseBucket *SparseFirstBucket(SparseIterator *iter, + SparseBin *binSparse, ulong cBuckets) +{ + iter->binSparse = binSparse; /* set it up for NextBucket() */ + iter->cBuckets = cBuckets; + iter->posOffset = -1; /* when we advance, we're at 0 */ + iter->posGroup = -1; + return SparseNextBucket(iter); +} + +/*************************************************************************\ +| SparseWrite() | +| SparseRead() | +| These are routines for storing a sparse hashtable onto disk. We | +| store the number of buckets and a bitmap indicating which buckets | +| are allocated (occupied). The actual contents of the buckets | +| must be stored separately. | +\*************************************************************************/ + +static void SparseWrite(FILE *fp, SparseBin *binSparse, ulong cBuckets) +{ + ulong i, j; + + WRITE_UL(fp, cBuckets); + for ( i = 0; i < SPARSE_GROUPS(cBuckets); i++ ) + for ( j = 0; j < (1<rgBuckets, cBuckets); +} + +static ulong DenseAllocate(DenseBin **pbin, ulong cBuckets) +{ + *pbin = (DenseBin *) HTsmalloc(sizeof(*pbin)); + (*pbin)->rgBuckets = (DenseBucket *) HTsmalloc(sizeof(*(*pbin)->rgBuckets) + * cBuckets); + DenseClear(*pbin, cBuckets); + return cBuckets; +} + +static DenseBin *DenseFree(DenseBin *bin, ulong cBuckets) +{ + HTfree(bin->rgBuckets, sizeof(*bin->rgBuckets) * cBuckets); + HTfree(bin, sizeof(*bin)); + return NULL; +} + +static int DenseIsEmpty(DenseBin *bin, ulong location) +{ + return DENSE_IS_EMPTY(bin->rgBuckets, location); +} + +static DenseBucket *DenseFind(DenseBin *bin, ulong location) +{ + if ( DenseIsEmpty(bin, location) ) + return NULL; + return bin->rgBuckets + location; +} + +static DenseBucket *DenseInsert(DenseBin *bin, DenseBucket *bckInsert, + ulong location, int *pfOverwrite) +{ + DenseBucket *bckPlace; + + bckPlace = DenseFind(bin, location); + if ( bckPlace ) /* means something is already there */ + { + if ( *pfOverwrite ) + *bckPlace = *bckInsert; + *pfOverwrite = 1; /* set to 1 to indicate someone was there */ + return bckPlace; + } + else + { + bin->rgBuckets[location] = *bckInsert; + *pfOverwrite = 0; + return bin->rgBuckets + location; + } +} + +static DenseBucket *DenseNextBucket(DenseIterator *iter) +{ + for ( iter->pos++; iter->pos < iter->cBuckets; iter->pos++ ) + if ( !DenseIsEmpty(iter->bin, iter->pos) ) + return iter->bin->rgBuckets + iter->pos; + return NULL; /* all remaining groups were empty */ +} + +static DenseBucket *DenseFirstBucket(DenseIterator *iter, + DenseBin *bin, ulong cBuckets) +{ + iter->bin = bin; /* set it up for NextBucket() */ + iter->cBuckets = cBuckets; + iter->pos = -1; /* thus the next bucket will be 0 */ + return DenseNextBucket(iter); +} + +static void DenseWrite(FILE *fp, DenseBin *bin, ulong cBuckets) +{ + ulong pos = 0, bit, bm; + + WRITE_UL(fp, cBuckets); + while ( pos < cBuckets ) + { + bm = 0; + for ( bit = 0; bit < 8*sizeof(ulong); bit++ ) + { + if ( !DenseIsEmpty(bin, pos) ) + SET_BITMAP(&bm, bit); /* in fks-hash.h */ + if ( ++pos == cBuckets ) + break; + } + WRITE_UL(fp, bm); + } +} + +static ulong DenseRead(FILE *fp, DenseBin **pbin) +{ + ulong pos = 0, bit, bm, cBuckets; + + READ_UL(fp, cBuckets); + cBuckets = DenseAllocate(pbin, cBuckets); + while ( pos < cBuckets ) + { + READ_UL(fp, bm); + for ( bit = 0; bit < 8*sizeof(ulong); bit++ ) + { + if ( TEST_BITMAP(&bm, bit) ) /* in fks-hash.h */ + DENSE_SET_OCCUPIED((*pbin)->rgBuckets, pos); + else + DENSE_SET_EMPTY((*pbin)->rgBuckets, pos); + if ( ++pos == cBuckets ) + break; + } + } + return cBuckets; +} + +static ulong DenseMemory(ulong cBuckets, ulong cOccupied) +{ + return cBuckets * sizeof(DenseBucket); +} + + +/* ======================================================================== */ +/* HASHING ROUTINES */ +/* ---------------------- */ + +/* Implements a simple quadratic hashing scheme. We have a single hash + * table of size t and a single hash function h(x). When inserting an + * item, first we try h(x) % t. If it's occupied, we try h(x) + + * i*(i-1)/2 % t for increasing values of i until we hit a not-occupied + * space. To make this dynamic, we double the size of the hash table as + * soon as more than half the cells are occupied. When deleting, we can + * choose to shrink the hashtable when less than a quarter of the + * cells are occupied, or we can choose never to shrink the hashtable. + * For lookup, we check h(x) + i*(i-1)/2 % t (starting with i=0) until + * we get a match or we hit an empty space. Note that as a result, + * we can't make a cell empty on deletion, or lookups may end prematurely. + * Instead we mark the cell as "deleted." We thus steal the value + * DELETED as a possible "data" value. As long as data are pointers, + * that's ok. + * The hash increment we use, i(i-1)/2, is not the standard quadratic + * hash increment, which is i^2. i(i-1)/2 covers the entire bucket space + * when the hashtable size is a power of two, as it is for us. In fact, + * the first n probes cover n distinct buckets; then it repeats. This + * guarantees insertion will always succeed. + * If you linear hashing, set JUMP in chash.h. You can also change + * various other parameters there. + */ + +/*************************************************************************\ +| Hash() | +| The hash function I use is due to Bob Jenkins (see | +| http://burtleburtle.net/bob/hash/evahash.html | +| According to http://burtleburtle.net/bob/c/lookup2.c, | +| his implementation is public domain.) | +| It takes 36 instructions, in 18 cycles if you're lucky. | +| hashing depends on the fact the hashtable size is always a | +| power of 2. cBuckets is probably ht->cBuckets. | +\*************************************************************************/ + +#if LOG_WORD_SIZE == 5 /* 32 bit words */ + +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} +#ifdef WORD_HASH /* play with this on little-endian machines */ +#define WORD_AT(ptr) ( *(ulong *)(ptr) ) +#else +#define WORD_AT(ptr) ( (ptr)[0] + ((ulong)(ptr)[1]<<8) + \ + ((ulong)(ptr)[2]<<16) + ((ulong)(ptr)[3]<<24) ) +#endif + +#elif LOG_WORD_SIZE == 6 /* 64 bit words */ + +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>43); \ + b -= c; b -= a; b ^= (a<<9); \ + c -= a; c -= b; c ^= (b>>8); \ + a -= b; a -= c; a ^= (c>>38); \ + b -= c; b -= a; b ^= (a<<23); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>35); \ + b -= c; b -= a; b ^= (a<<49); \ + c -= a; c -= b; c ^= (b>>11); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<18); \ + c -= a; c -= b; c ^= (b>>22); \ +} +#ifdef WORD_HASH /* alpha is little-endian, btw */ +#define WORD_AT(ptr) ( *(ulong *)(ptr) ) +#else +#define WORD_AT(ptr) ( (ptr)[0] + ((ulong)(ptr)[1]<<8) + \ + ((ulong)(ptr)[2]<<16) + ((ulong)(ptr)[3]<<24) + \ + ((ulong)(ptr)[4]<<32) + ((ulong)(ptr)[5]<<40) + \ + ((ulong)(ptr)[6]<<48) + ((ulong)(ptr)[7]<<56) ) +#endif + +#else /* neither 32 or 64 bit words */ +#error This hash function can only hash 32 or 64 bit words. Sorry. +#endif + +static ulong Hash(HashTable *ht, char *key, ulong cBuckets) +{ + ulong a, b, c, cchKey, cchKeyOrig; + + cchKeyOrig = ht->cchKey == NULL_TERMINATED ? strlen(key) : ht->cchKey; + a = b = c = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + + for ( cchKey = cchKeyOrig; cchKey >= 3 * sizeof(ulong); + cchKey -= 3 * sizeof(ulong), key += 3 * sizeof(ulong) ) + { + a += WORD_AT(key); + b += WORD_AT(key + sizeof(ulong)); + c += WORD_AT(key + sizeof(ulong)*2); + mix(a,b,c); + } + + c += cchKeyOrig; + switch ( cchKey ) { /* deal with rest. Cases fall through */ +#if LOG_WORD_SIZE == 5 + case 11: c += (ulong)key[10]<<24; + case 10: c += (ulong)key[9]<<16; + case 9 : c += (ulong)key[8]<<8; + /* the first byte of c is reserved for the length */ + case 8 : b += WORD_AT(key+4); a+= WORD_AT(key); break; + case 7 : b += (ulong)key[6]<<16; + case 6 : b += (ulong)key[5]<<8; + case 5 : b += key[4]; + case 4 : a += WORD_AT(key); break; + case 3 : a += (ulong)key[2]<<16; + case 2 : a += (ulong)key[1]<<8; + case 1 : a += key[0]; + /* case 0 : nothing left to add */ +#elif LOG_WORD_SIZE == 6 + case 23: c += (ulong)key[22]<<56; + case 22: c += (ulong)key[21]<<48; + case 21: c += (ulong)key[20]<<40; + case 20: c += (ulong)key[19]<<32; + case 19: c += (ulong)key[18]<<24; + case 18: c += (ulong)key[17]<<16; + case 17: c += (ulong)key[16]<<8; + /* the first byte of c is reserved for the length */ + case 16: b += WORD_AT(key+8); a+= WORD_AT(key); break; + case 15: b += (ulong)key[14]<<48; + case 14: b += (ulong)key[13]<<40; + case 13: b += (ulong)key[12]<<32; + case 12: b += (ulong)key[11]<<24; + case 11: b += (ulong)key[10]<<16; + case 10: b += (ulong)key[ 9]<<8; + case 9: b += (ulong)key[ 8]; + case 8: a += WORD_AT(key); break; + case 7: a += (ulong)key[ 6]<<48; + case 6: a += (ulong)key[ 5]<<40; + case 5: a += (ulong)key[ 4]<<32; + case 4: a += (ulong)key[ 3]<<24; + case 3: a += (ulong)key[ 2]<<16; + case 2: a += (ulong)key[ 1]<<8; + case 1: a += (ulong)key[ 0]; + /* case 0: nothing left to add */ +#endif + } + mix(a,b,c); + return c & (cBuckets-1); +} + + +/*************************************************************************\ +| Rehash() | +| You give me a hashtable, a new size, and a bucket to follow, and | +| I resize the hashtable's bin to be the new size, rehashing | +| everything in it. I keep particular track of the bucket you pass | +| in, and RETURN a pointer to where the item in the bucket got to. | +| (If you pass in NULL, I return an arbitrary pointer.) | +\*************************************************************************/ + +static HTItem *Rehash(HashTable *ht, ulong cNewBuckets, HTItem *bckWatch) +{ + Table *tableNew; + ulong iBucketFirst; + HTItem *bck, *bckNew = NULL; + ulong offset; /* the i in h(x) + i*(i-1)/2 */ + int fOverwrite = 0; /* not an issue: there can be no collisions */ + + assert( ht->table ); + cNewBuckets = Table(Allocate)(&tableNew, cNewBuckets); + /* Since we RETURN the new position of bckWatch, we want * + * to make sure it doesn't get moved due to some table * + * rehashing that comes after it's inserted. Thus, we * + * have to put it in last. This makes the loop weird. */ + for ( bck = HashFirstBucket(ht); ; bck = HashNextBucket(ht) ) + { + if ( bck == NULL ) /* we're done iterating, so look at bckWatch */ + { + bck = bckWatch; + if ( bck == NULL ) /* I guess bckWatch wasn't specified */ + break; + } + else if ( bck == bckWatch ) + continue; /* ignore if we see it during the iteration */ + + offset = 0; /* a new i for a new bucket */ + for ( iBucketFirst = Hash(ht, KEY_PTR(ht, bck->key), cNewBuckets); + !Table(IsEmpty)(tableNew, iBucketFirst); + iBucketFirst = (iBucketFirst + JUMP(KEY_PTR(ht,bck->key), offset)) + & (cNewBuckets-1) ) + ; + bckNew = Table(Insert)(tableNew, bck, iBucketFirst, &fOverwrite); + if ( bck == bckWatch ) /* we're done with the last thing to do */ + break; + } + Table(Free)(ht->table, ht->cBuckets); + ht->table = tableNew; + ht->cBuckets = cNewBuckets; + ht->cDeletedItems = 0; + return bckNew; /* new position of bckWatch, which was inserted last */ +} + +/*************************************************************************\ +| Find() | +| Does the quadratic searching stuff. RETURNS NULL if we don't | +| find an object with the given key, and a pointer to the Item | +| holding the key, if we do. Also sets posLastFind. If piEmpty is | +| non-NULL, we set it to the first open bucket we pass; helpful for | +| doing a later insert if the search fails, for instance. | +\*************************************************************************/ + +static HTItem *Find(HashTable *ht, ulong key, ulong *piEmpty) +{ + ulong iBucketFirst; + HTItem *item; + ulong offset = 0; /* the i in h(x) + i*(i-1)/2 */ + int fFoundEmpty = 0; /* set when we pass over an empty bucket */ + + ht->posLastFind = NULL; /* set up for failure: a new find starts */ + if ( ht->table == NULL ) /* empty hash table: find is bound to fail */ + return NULL; + + iBucketFirst = Hash(ht, KEY_PTR(ht, key), ht->cBuckets); + while ( 1 ) /* now try all i > 0 */ + { + item = Table(Find)(ht->table, iBucketFirst); + if ( item == NULL ) /* it's not in the table */ + { + if ( piEmpty && !fFoundEmpty ) *piEmpty = iBucketFirst; + return NULL; + } + else + { + if ( IS_BCK_DELETED(item) ) /* always 0 ifdef INSERT_ONLY */ + { + if ( piEmpty && !fFoundEmpty ) + { + *piEmpty = iBucketFirst; + fFoundEmpty = 1; + } + } else + if ( !KEY_CMP(ht, key, item->key) ) /* must be occupied */ + { + ht->posLastFind = item; + return item; /* we found it! */ + } + } + iBucketFirst = ((iBucketFirst + JUMP(KEY_PTR(ht, key), offset)) + & (ht->cBuckets-1)); + } +} + +/*************************************************************************\ +| Insert() | +| If an item with the key already exists in the hashtable, RETURNS | +| a pointer to the item (replacing its data if fOverwrite is 1). | +| If not, we find the first place-to-insert (which Find() is nice | +| enough to set for us) and insert the item there, RETURNing a | +| pointer to the item. We might grow the hashtable if it's getting | +| full. Note we include buckets holding DELETED when determining | +| fullness, because they slow down searching. | +\*************************************************************************/ + +static ulong NextPow2(ulong x) /* returns next power of 2 > x, or 2^31 */ +{ + if ( ((x << 1) >> 1) != x ) /* next power of 2 overflows */ + x >>= 1; /* so we return highest power of 2 we can */ + while ( (x & (x-1)) != 0 ) /* blacks out all but the top bit */ + x &= (x-1); + return x << 1; /* makes it the *next* power of 2 */ +} + +static HTItem *Insert(HashTable *ht, ulong key, ulong data, int fOverwrite) +{ + HTItem *item, bckInsert; + ulong iEmpty; /* first empty bucket key probes */ + + if ( ht->table == NULL ) /* empty hash table: find is bound to fail */ + return NULL; + item = Find(ht, key, &iEmpty); + ht->posLastFind = NULL; /* last operation is insert, not find */ + if ( item ) + { + if ( fOverwrite ) + item->data = data; /* key already matches */ + return item; + } + + COPY_KEY(ht, bckInsert.key, key); /* make our own copy of the key */ + bckInsert.data = data; /* oh, and the data too */ + item = Table(Insert)(ht->table, &bckInsert, iEmpty, &fOverwrite); + if ( fOverwrite ) /* we overwrote a deleted bucket */ + ht->cDeletedItems--; + ht->cItems++; /* insert couldn't have overwritten */ + if ( ht->cDeltaGoalSize > 0 ) /* closer to our goal size */ + ht->cDeltaGoalSize--; + if ( ht->cItems + ht->cDeletedItems >= ht->cBuckets * OCCUPANCY_PCT + || ht->cDeltaGoalSize < 0 ) /* we must've overestimated # of deletes */ + item = Rehash(ht, + NextPow2((ulong)(((ht->cDeltaGoalSize > 0 ? + ht->cDeltaGoalSize : 0) + + ht->cItems) / OCCUPANCY_PCT)), + item); + return item; +} + +/*************************************************************************\ +| Delete() | +| Removes the item from the hashtable, and if fShrink is 1, will | +| shrink the hashtable if it's too small (ie even after halving, | +| the ht would be less than half full, though in order to avoid | +| oscillating table size, we insist that after halving the ht would | +| be less than 40% full). RETURNS 1 if the item was found, 0 else. | +| If fLastFindSet is true, then this function is basically | +| DeleteLastFind. | +\*************************************************************************/ + +static int Delete(HashTable *ht, ulong key, int fShrink, int fLastFindSet) +{ + if ( !fLastFindSet && !Find(ht, key, NULL) ) + return 0; + SET_BCK_DELETED(ht, ht->posLastFind); /* find set this, how nice */ + ht->cItems--; + ht->cDeletedItems++; + if ( ht->cDeltaGoalSize < 0 ) /* heading towards our goal of deletion */ + ht->cDeltaGoalSize++; + + if ( fShrink && ht->cItems < ht->cBuckets * OCCUPANCY_PCT*0.4 + && ht->cDeltaGoalSize >= 0 /* wait until we're done deleting */ + && (ht->cBuckets >> 1) >= MIN_HASH_SIZE ) /* shrink */ + Rehash(ht, + NextPow2((ulong)((ht->cItems+ht->cDeltaGoalSize)/OCCUPANCY_PCT)), + NULL); + ht->posLastFind = NULL; /* last operation is delete, not find */ + return 1; +} + + +/* ======================================================================== */ +/* USER-VISIBLE API */ +/* ---------------------- */ + +/*************************************************************************\ +| AllocateHashTable() | +| ClearHashTable() | +| FreeHashTable() | +| Allocate() allocates a hash table and sets up size parameters. | +| Free() frees it. Clear() deletes all the items from the hash | +| table, but frees not. | +| cchKey is < 0 if the keys you send me are meant to be pointers | +| to \0-terminated strings. Then -cchKey is the maximum key size. | +| If cchKey < one word (ulong), the keys you send me are the keys | +| themselves; else the keys you send me are pointers to the data. | +| If fSaveKeys is 1, we copy any keys given to us to insert. We | +| also free these keys when freeing the hash table. If it's 0, the | +| user is responsible for key space management. | +| AllocateHashTable() RETURNS a hash table; the others TAKE one. | +\*************************************************************************/ + +HashTable *AllocateHashTable(int cchKey, int fSaveKeys) +{ + HashTable *ht; + + ht = (HashTable *) HTsmalloc(sizeof(*ht)); /* set everything to 0 */ + ht->cBuckets = Table(Allocate)(&ht->table, MIN_HASH_SIZE); + ht->cchKey = cchKey <= 0 ? NULL_TERMINATED : cchKey; + ht->cItems = 0; + ht->cDeletedItems = 0; + ht->fSaveKeys = fSaveKeys; + ht->cDeltaGoalSize = 0; + ht->iter = HTsmalloc( sizeof(TableIterator) ); + + ht->fpData = NULL; /* set by HashLoad, maybe */ + ht->bckData.data = (ulong) NULL; /* this must be done */ + HTSetupKeyTrunc(); /* in util.c */ + return ht; +} + +void ClearHashTable(HashTable *ht) +{ + HTItem *bck; + + if ( STORES_PTR(ht) && ht->fSaveKeys ) /* need to free keys */ + for ( bck = HashFirstBucket(ht); bck; bck = HashNextBucket(ht) ) + { + FREE_KEY(ht, bck->key); + if ( ht->fSaveKeys == 2 ) /* this means key stored in one block */ + break; /* ...so only free once */ + } + Table(Free)(ht->table, ht->cBuckets); + ht->cBuckets = Table(Allocate)(&ht->table, MIN_HASH_SIZE); + + ht->cItems = 0; + ht->cDeletedItems = 0; + ht->cDeltaGoalSize = 0; + ht->posLastFind = NULL; + ht->fpData = NULL; /* no longer HashLoading */ + if ( ht->bckData.data ) free( (char *)(ht)->bckData.data); + ht->bckData.data = (ulong) NULL; +} + +void FreeHashTable(HashTable *ht) +{ + ClearHashTable(ht); + if ( ht->iter ) HTfree(ht->iter, sizeof(TableIterator)); + if ( ht->table ) Table(Free)(ht->table, ht->cBuckets); + free(ht); +} + +/*************************************************************************\ +| HashFind() | +| HashFindLast() | +| HashFind(): looks in h(x) + i(i-1)/2 % t as i goes up from 0 | +| until we either find the key or hit an empty bucket. RETURNS a | +| pointer to the item in the hit bucket, if we find it, else | +| RETURNS NULL. | +| HashFindLast() returns the item returned by the last | +| HashFind(), which may be NULL if the last HashFind() failed. | +| LOAD_AND_RETURN reads the data from off disk, if necessary. | +\*************************************************************************/ + +HTItem *HashFind(HashTable *ht, ulong key) +{ + LOAD_AND_RETURN(ht, Find(ht, KEY_TRUNC(ht, key), NULL)); +} + +HTItem *HashFindLast(HashTable *ht) +{ + LOAD_AND_RETURN(ht, ht->posLastFind); +} + +/*************************************************************************\ +| HashFindOrInsert() | +| HashFindOrInsertItem() | +| HashInsert() | +| HashInsertItem() | +| HashDelete() | +| HashDeleteLast() | +| Pretty obvious what these guys do. Some take buckets (items), | +| some take keys and data separately. All things RETURN the bucket | +| (a pointer into the hashtable) if appropriate. | +\*************************************************************************/ + +HTItem *HashFindOrInsert(HashTable *ht, ulong key, ulong dataInsert) +{ + /* This is equivalent to Insert without samekey-overwrite */ + return Insert(ht, KEY_TRUNC(ht, key), dataInsert, 0); +} + +HTItem *HashFindOrInsertItem(HashTable *ht, HTItem *pItem) +{ + return HashFindOrInsert(ht, pItem->key, pItem->data); +} + +HTItem *HashInsert(HashTable *ht, ulong key, ulong data) +{ + return Insert(ht, KEY_TRUNC(ht, key), data, SAMEKEY_OVERWRITE); +} + +HTItem *HashInsertItem(HashTable *ht, HTItem *pItem) +{ + return HashInsert(ht, pItem->key, pItem->data); +} + +int HashDelete(HashTable *ht, ulong key) +{ + return Delete(ht, KEY_TRUNC(ht, key), !FAST_DELETE, 0); +} + +int HashDeleteLast(HashTable *ht) +{ + if ( !ht->posLastFind ) /* last find failed */ + return 0; + return Delete(ht, 0, !FAST_DELETE, 1); /* no need to specify a key */ +} + +/*************************************************************************\ +| HashFirstBucket() | +| HashNextBucket() | +| Iterates through the items in the hashtable by iterating through | +| the table. Since we know about deleted buckets and loading data | +| off disk, and the table doesn't, our job is to take care of these | +| things. RETURNS a bucket, or NULL after the last bucket. | +\*************************************************************************/ + +HTItem *HashFirstBucket(HashTable *ht) +{ + HTItem *retval; + + for ( retval = Table(FirstBucket)(ht->iter, ht->table, ht->cBuckets); + retval; retval = Table(NextBucket)(ht->iter) ) + if ( !IS_BCK_DELETED(retval) ) + LOAD_AND_RETURN(ht, retval); + return NULL; +} + +HTItem *HashNextBucket(HashTable *ht) +{ + HTItem *retval; + + while ( (retval=Table(NextBucket)(ht->iter)) ) + if ( !IS_BCK_DELETED(retval) ) + LOAD_AND_RETURN(ht, retval); + return NULL; +} + +/*************************************************************************\ +| HashSetDeltaGoalSize() | +| If we're going to insert 100 items, set the delta goal size to | +| 100 and we take that into account when inserting. Likewise, if | +| we're going to delete 10 items, set it to -100 and we won't | +| rehash until all 100 have been done. It's ok to be wrong, but | +| it's efficient to be right. Returns the delta value. | +\*************************************************************************/ + +int HashSetDeltaGoalSize(HashTable *ht, int delta) +{ + ht->cDeltaGoalSize = delta; +#if FAST_DELETE == 1 || defined INSERT_ONLY + if ( ht->cDeltaGoalSize < 0 ) /* for fast delete, we never */ + ht->cDeltaGoalSize = 0; /* ...rehash after deletion */ +#endif + return ht->cDeltaGoalSize; +} + + +/*************************************************************************\ +| HashSave() | +| HashLoad() | +| HashLoadKeys() | +| Routines for saving and loading the hashtable from disk. We can | +| then use the hashtable in two ways: loading it back into memory | +| (HashLoad()) or loading only the keys into memory, in which case | +| the data for a given key is loaded off disk when the key is | +| retrieved. The data is freed when something new is retrieved in | +| its place, so this is not a "lazy-load" scheme. | +| The key is saved automatically and restored upon load, but the | +| user needs to specify a routine for reading and writing the data. | +| fSaveKeys is of course set to 1 when you read in a hashtable. | +| HashLoad RETURNS a newly allocated hashtable. | +| DATA_WRITE() takes an fp and a char * (representing the data | +| field), and must perform two separate tasks. If fp is NULL, | +| return the number of bytes written. If not, writes the data to | +| disk at the place the fp points to. | +| DATA_READ() takes an fp and the number of bytes in the data | +| field, and returns a char * which points to wherever you've | +| written the data. Thus, you must allocate memory for the data. | +| Both dataRead and dataWrite may be NULL if you just wish to | +| store the data field directly, as an integer. | +\*************************************************************************/ + +void HashSave(FILE *fp, HashTable *ht, int (*dataWrite)(FILE *, char *)) +{ + long cchData, posStart; + HTItem *bck; + + /* File format: magic number (4 bytes) + : cchKey (one word) + : cItems (one word) + : cDeletedItems (one word) + : table info (buckets and a bitmap) + : cchAllKeys (one word) + Then the keys, in a block. If cchKey is NULL_TERMINATED, the keys + are null-terminated too, otherwise this takes up cchKey*cItems bytes. + Note that keys are not written for DELETED buckets. + Then the data: + : EITHER DELETED (one word) to indicate it's a deleted bucket, + : OR number of bytes for this (non-empty) bucket's data + (one word). This is not stored if dataWrite == NULL + since the size is known to be sizeof(ul). Plus: + : the data for this bucket (variable length) + All words are in network byte order. */ + + fprintf(fp, "%s", MAGIC_KEY); + WRITE_UL(fp, ht->cchKey); /* WRITE_UL, READ_UL, etc in fks-hash.h */ + WRITE_UL(fp, ht->cItems); + WRITE_UL(fp, ht->cDeletedItems); + Table(Write)(fp, ht->table, ht->cBuckets); /* writes cBuckets too */ + + WRITE_UL(fp, 0); /* to be replaced with sizeof(key block) */ + posStart = ftell(fp); + for ( bck = HashFirstBucket(ht); bck; bck = HashNextBucket(ht) ) + fwrite(KEY_PTR(ht, bck->key), 1, + (ht->cchKey == NULL_TERMINATED ? + strlen(KEY_PTR(ht, bck->key))+1 : ht->cchKey), fp); + cchData = ftell(fp) - posStart; + fseek(fp, posStart - sizeof(unsigned long), SEEK_SET); + WRITE_UL(fp, cchData); + fseek(fp, 0, SEEK_END); /* done with our sojourn at the header */ + + /* Unlike HashFirstBucket, TableFirstBucket iters through deleted bcks */ + for ( bck = Table(FirstBucket)(ht->iter, ht->table, ht->cBuckets); + bck; bck = Table(NextBucket)(ht->iter) ) + if ( dataWrite == NULL || IS_BCK_DELETED(bck) ) + WRITE_UL(fp, bck->data); + else /* write cchData followed by the data */ + { + WRITE_UL(fp, (*dataWrite)(NULL, (char *)bck->data)); + (*dataWrite)(fp, (char *)bck->data); + } +} + +static HashTable *HashDoLoad(FILE *fp, char * (*dataRead)(FILE *, int), + HashTable *ht) +{ + ulong cchKey; + char szMagicKey[4], *rgchKeys; + HTItem *bck; + + fread(szMagicKey, 1, 4, fp); + if ( strncmp(szMagicKey, MAGIC_KEY, 4) ) + { + fprintf(stderr, "ERROR: not a hash table (magic key is %4.4s, not %s)\n", + szMagicKey, MAGIC_KEY); + exit(3); + } + Table(Free)(ht->table, ht->cBuckets); /* allocated in AllocateHashTable */ + + READ_UL(fp, ht->cchKey); + READ_UL(fp, ht->cItems); + READ_UL(fp, ht->cDeletedItems); + ht->cBuckets = Table(Read)(fp, &ht->table); /* next is the table info */ + + READ_UL(fp, cchKey); + rgchKeys = (char *) HTsmalloc( cchKey ); /* stores all the keys */ + fread(rgchKeys, 1, cchKey, fp); + /* We use the table iterator so we don't try to LOAD_AND_RETURN */ + for ( bck = Table(FirstBucket)(ht->iter, ht->table, ht->cBuckets); + bck; bck = Table(NextBucket)(ht->iter) ) + { + READ_UL(fp, bck->data); /* all we need if dataRead is NULL */ + if ( IS_BCK_DELETED(bck) ) /* always 0 if defined(INSERT_ONLY) */ + continue; /* this is why we read the data first */ + if ( dataRead != NULL ) /* if it's null, we're done */ + if ( !ht->fpData ) /* load data into memory */ + bck->data = (ulong)dataRead(fp, bck->data); + else /* store location of data on disk */ + { + fseek(fp, bck->data, SEEK_CUR); /* bck->data held size of data */ + bck->data = ftell(fp) - bck->data - sizeof(unsigned long); + } + + if ( ht->cchKey == NULL_TERMINATED ) /* now read the key */ + { + bck->key = (ulong) rgchKeys; + rgchKeys = strchr(rgchKeys, '\0') + 1; /* read past the string */ + } + else + { + if ( STORES_PTR(ht) ) /* small keys stored directly */ + bck->key = (ulong) rgchKeys; + else + memcpy(&bck->key, rgchKeys, ht->cchKey); + rgchKeys += ht->cchKey; + } + } + if ( !STORES_PTR(ht) ) /* keys are stored directly */ + HTfree(rgchKeys - cchKey, cchKey); /* we've advanced rgchK to end */ + return ht; +} + +HashTable *HashLoad(FILE *fp, char * (*dataRead)(FILE *, int)) +{ + HashTable *ht; + ht = AllocateHashTable(0, 2); /* cchKey set later, fSaveKey should be 2! */ + return HashDoLoad(fp, dataRead, ht); +} + +HashTable *HashLoadKeys(FILE *fp, char * (*dataRead)(FILE *, int)) +{ + HashTable *ht; + + if ( dataRead == NULL ) + return HashLoad(fp, NULL); /* no reason not to load the data here */ + ht = AllocateHashTable(0, 2); /* cchKey set later, fSaveKey should be 2! */ + ht->fpData = fp; /* tells HashDoLoad() to only load keys */ + ht->dataRead = dataRead; + return HashDoLoad(fp, dataRead, ht); +} + +/*************************************************************************\ +| PrintHashTable() | +| A debugging tool. Prints the entire contents of the hash table, | +| like so: : key of the contents. Returns number of bytes | +| allocated. If time is not -1, we print it as the time required | +| for the hash. If iForm is 0, we just print the stats. If it's | +| 1, we print the keys and data too, but the keys are printed as | +| ulongs. If it's 2, we print the keys correctly (as long numbers | +| or as strings). | +\*************************************************************************/ + +ulong PrintHashTable(HashTable *ht, double time, int iForm) +{ + ulong cbData = 0, cbBin = 0, cItems = 0, cOccupied = 0; + HTItem *item; + + printf("HASH TABLE.\n"); + if ( time > -1.0 ) + { + printf("----------\n"); + printf("Time: %27.2f\n", time); + } + + for ( item = Table(FirstBucket)(ht->iter, ht->table, ht->cBuckets); + item; item = Table(NextBucket)(ht->iter) ) + { + cOccupied++; /* this includes deleted buckets */ + if ( IS_BCK_DELETED(item) ) /* we don't need you for anything else */ + continue; + cItems++; /* this is for a sanity check */ + if ( STORES_PTR(ht) ) + cbData += ht->cchKey == NULL_TERMINATED ? + WORD_ROUND(strlen((char *)item->key)+1) : ht->cchKey; + else + cbBin -= sizeof(item->key), cbData += sizeof(item->key); + cbBin -= sizeof(item->data), cbData += sizeof(item->data); + if ( iForm != 0 ) /* we want the actual contents */ + { + if ( iForm == 2 && ht->cchKey == NULL_TERMINATED ) + printf("%s/%lu\n", (char *)item->key, item->data); + else if ( iForm == 2 && STORES_PTR(ht) ) + printf("%.*s/%lu\n", + (int)ht->cchKey, (char *)item->key, item->data); + else /* either key actually is a ulong, or iForm == 1 */ + printf("%lu/%lu\n", item->key, item->data); + } + } + assert( cItems == ht->cItems ); /* sanity check */ + cbBin = Table(Memory)(ht->cBuckets, cOccupied); + + printf("----------\n"); + printf("%lu buckets (%lu bytes). %lu empty. %lu hold deleted items.\n" + "%lu items (%lu bytes).\n" + "%lu bytes total. %lu bytes (%2.1f%%) of this is ht overhead.\n", + ht->cBuckets, cbBin, ht->cBuckets - cOccupied, cOccupied - ht->cItems, + ht->cItems, cbData, + cbData + cbBin, cbBin, cbBin*100.0/(cbBin+cbData)); + + return cbData + cbBin; +} diff --git a/src/sparsehash-1.6/experimental/libchash.h b/src/sparsehash-1.6/experimental/libchash.h new file mode 100644 index 0000000..0c0f70a --- /dev/null +++ b/src/sparsehash-1.6/experimental/libchash.h @@ -0,0 +1,252 @@ +/* Copyright (c) 1998 - 2005, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Craig Silverstein + * + * This library is intended to be used for in-memory hash tables, + * though it provides rudimentary permanent-storage capabilities. + * It attempts to be fast, portable, and small. The best algorithm + * to fulfill these goals is an internal probing hashing algorithm, + * as in Knuth, _Art of Computer Programming_, vol III. Unlike + * chained (open) hashing, it doesn't require a pointer for every + * item, yet it is still constant time lookup in practice. + * + * Also to save space, we let the contents (both data and key) that + * you insert be a union: if the key/data is small, we store it + * directly in the hashtable, otherwise we store a pointer to it. + * To keep you from having to figure out which, use KEY_PTR and + * PTR_KEY to convert between the arguments to these functions and + * a pointer to the real data. For instance: + * char key[] = "ab", *key2; + * HTItem *bck; HashTable *ht; + * HashInsert(ht, PTR_KEY(ht, key), 0); + * bck = HashFind(ht, PTR_KEY(ht, "ab")); + * key2 = KEY_PTR(ht, bck->key); + * + * There are a rich set of operations supported: + * AllocateHashTable() -- Allocates a hashtable structure and + * returns it. + * cchKey: if it's a positive number, then each key is a + * fixed-length record of that length. If it's 0, + * the key is assumed to be a \0-terminated string. + * fSaveKey: normally, you are responsible for allocating + * space for the key. If this is 1, we make a + * copy of the key for you. + * ClearHashTable() -- Removes everything from a hashtable + * FreeHashTable() -- Frees memory used by a hashtable + * + * HashFind() -- takes a key (use PTR_KEY) and returns the + * HTItem containing that key, or NULL if the + * key is not in the hashtable. + * HashFindLast() -- returns the item found by last HashFind() + * HashFindOrInsert() -- inserts the key/data pair if the key + * is not already in the hashtable, or + * returns the appropraite HTItem if it is. + * HashFindOrInsertItem() -- takes key/data as an HTItem. + * HashInsert() -- adds a key/data pair to the hashtable. What + * it does if the key is already in the table + * depends on the value of SAMEKEY_OVERWRITE. + * HashInsertItem() -- takes key/data as an HTItem. + * HashDelete() -- removes a key/data pair from the hashtable, + * if it's there. RETURNS 1 if it was there, + * 0 else. + * If you use sparse tables and never delete, the full data + * space is available. Otherwise we steal -2 (maybe -3), + * so you can't have data fields with those values. + * HashDeleteLast() -- deletes the item returned by the last Find(). + * + * HashFirstBucket() -- used to iterate over the buckets in a + * hashtable. DON'T INSERT OR DELETE WHILE + * ITERATING! You can't nest iterations. + * HashNextBucket() -- RETURNS NULL at the end of iterating. + * + * HashSetDeltaGoalSize() -- if you're going to insert 1000 items + * at once, call this fn with arg 1000. + * It grows the table more intelligently. + * + * HashSave() -- saves the hashtable to a file. It saves keys ok, + * but it doesn't know how to interpret the data field, + * so if the data field is a pointer to some complex + * structure, you must send a function that takes a + * file pointer and a pointer to the structure, and + * write whatever you want to write. It should return + * the number of bytes written. If the file is NULL, + * it should just return the number of bytes it would + * write, without writing anything. + * If your data field is just an integer, not a + * pointer, just send NULL for the function. + * HashLoad() -- loads a hashtable. It needs a function that takes + * a file and the size of the structure, and expects + * you to read in the structure and return a pointer + * to it. You must do memory allocation, etc. If + * the data is just a number, send NULL. + * HashLoadKeys() -- unlike HashLoad(), doesn't load the data off disk + * until needed. This saves memory, but if you look + * up the same key a lot, it does a disk access each + * time. + * You can't do Insert() or Delete() on hashtables that were loaded + * from disk. + */ + +#include /* includes definition of "ulong", we hope */ +#define ulong u_long + +#define MAGIC_KEY "CHsh" /* when we save the file */ + +#ifndef LOG_WORD_SIZE /* 5 for 32 bit words, 6 for 64 */ +#if defined (__LP64__) || defined (_LP64) +#define LOG_WORD_SIZE 6 /* log_2(sizeof(ulong)) [in bits] */ +#else +#define LOG_WORD_SIZE 5 /* log_2(sizeof(ulong)) [in bits] */ +#endif +#endif + + /* The following gives a speed/time tradeoff: how many buckets are * + * in each bin. 0 gives 32 buckets/bin, which is a good number. */ +#ifndef LOG_BM_WORDS +#define LOG_BM_WORDS 0 /* each group has 2^L_B_W * 32 buckets */ +#endif + + /* The following are all parameters that affect performance. */ +#ifndef JUMP +#define JUMP(key, offset) ( ++(offset) ) /* ( 1 ) for linear hashing */ +#endif +#ifndef Table +#define Table(x) Sparse##x /* Dense##x for dense tables */ +#endif +#ifndef FAST_DELETE +#define FAST_DELETE 0 /* if it's 1, we never shrink the ht */ +#endif +#ifndef SAMEKEY_OVERWRITE +#define SAMEKEY_OVERWRITE 1 /* overwrite item with our key on insert? */ +#endif +#ifndef OCCUPANCY_PCT +#define OCCUPANCY_PCT 0.5 /* large PCT means smaller and slower */ +#endif +#ifndef MIN_HASH_SIZE +#define MIN_HASH_SIZE 512 /* ht size when first created */ +#endif + /* When deleting a bucket, we can't just empty it (future hashes * + * may fail); instead we set the data field to DELETED. Thus you * + * should set DELETED to a data value you never use. Better yet, * + * if you don't need to delete, define INSERT_ONLY. */ +#ifndef INSERT_ONLY +#define DELETED -2UL +#define IS_BCK_DELETED(bck) ( (bck) && (bck)->data == DELETED ) +#define SET_BCK_DELETED(ht, bck) do { (bck)->data = DELETED; \ + FREE_KEY(ht, (bck)->key); } while ( 0 ) +#else +#define IS_BCK_DELETED(bck) 0 +#define SET_BCK_DELETED(ht, bck) \ + do { fprintf(stderr, "Deletion not supported for insert-only hashtable\n");\ + exit(2); } while ( 0 ) +#endif + + /* We need the following only for dense buckets (Dense##x above). * + * If you need to, set this to a value you'll never use for data. */ +#define EMPTY -3UL /* steal more of the bck->data space */ + + + /* This is what an item is. Either can be cast to a pointer. */ +typedef struct { + ulong data; /* 4 bytes for data: either a pointer or an integer */ + ulong key; /* 4 bytes for the key: either a pointer or an int */ +} HTItem; + +struct Table(Bin); /* defined in chash.c, I hope */ +struct Table(Iterator); +typedef struct Table(Bin) Table; /* Expands to SparseBin, etc */ +typedef struct Table(Iterator) TableIterator; + + /* for STORES_PTR to work ok, cchKey MUST BE DEFINED 1st, cItems 2nd! */ +typedef struct HashTable { + ulong cchKey; /* the length of the key, or if it's \0 terminated */ + ulong cItems; /* number of items currently in the hashtable */ + ulong cDeletedItems; /* # of buckets holding DELETE in the hashtable */ + ulong cBuckets; /* size of the table */ + Table *table; /* The actual contents of the hashtable */ + int fSaveKeys; /* 1 if we copy keys locally; 2 if keys in one block */ + int cDeltaGoalSize; /* # of coming inserts (or deletes, if <0) we expect */ + HTItem *posLastFind; /* position of last Find() command */ + TableIterator *iter; /* used in First/NextBucket */ + + FILE *fpData; /* if non-NULL, what item->data points into */ + char * (*dataRead)(FILE *, int); /* how to load data from disk */ + HTItem bckData; /* holds data after being loaded from disk */ +} HashTable; + + /* Small keys are stored and passed directly, but large keys are + * stored and passed as pointers. To make it easier to remember + * what to pass, we provide two functions: + * PTR_KEY: give it a pointer to your data, and it returns + * something appropriate to send to Hash() functions or + * be stored in a data field. + * KEY_PTR: give it something returned by a Hash() routine, and + * it returns a (char *) pointer to the actual data. + */ +#define HashKeySize(ht) ( ((ulong *)(ht))[0] ) /* this is how we inline */ +#define HashSize(ht) ( ((ulong *)(ht))[1] ) /* ...a la C++ :-) */ + +#define STORES_PTR(ht) ( HashKeySize(ht) == 0 || \ + HashKeySize(ht) > sizeof(ulong) ) +#define KEY_PTR(ht, key) ( STORES_PTR(ht) ? (char *)(key) : (char *)&(key) ) +#ifdef DONT_HAVE_TO_WORRY_ABOUT_BUS_ERRORS +#define PTR_KEY(ht, ptr) ( STORES_PTR(ht) ? (ulong)(ptr) : *(ulong *)(ptr) ) +#else +#define PTR_KEY(ht, ptr) ( STORES_PTR(ht) ? (ulong)(ptr) : HTcopy((char *)ptr)) +#endif + + + /* Function prototypes */ +unsigned long HTcopy(char *pul); /* for PTR_KEY, not for users */ + +struct HashTable *AllocateHashTable(int cchKey, int fSaveKeys); +void ClearHashTable(struct HashTable *ht); +void FreeHashTable(struct HashTable *ht); + +HTItem *HashFind(struct HashTable *ht, ulong key); +HTItem *HashFindLast(struct HashTable *ht); +HTItem *HashFindOrInsert(struct HashTable *ht, ulong key, ulong dataInsert); +HTItem *HashFindOrInsertItem(struct HashTable *ht, HTItem *pItem); + +HTItem *HashInsert(struct HashTable *ht, ulong key, ulong data); +HTItem *HashInsertItem(struct HashTable *ht, HTItem *pItem); + +int HashDelete(struct HashTable *ht, ulong key); +int HashDeleteLast(struct HashTable *ht); + +HTItem *HashFirstBucket(struct HashTable *ht); +HTItem *HashNextBucket(struct HashTable *ht); + +int HashSetDeltaGoalSize(struct HashTable *ht, int delta); + +void HashSave(FILE *fp, struct HashTable *ht, int (*write)(FILE *, char *)); +struct HashTable *HashLoad(FILE *fp, char * (*read)(FILE *, int)); +struct HashTable *HashLoadKeys(FILE *fp, char * (*read)(FILE *, int)); diff --git a/src/sparsehash-1.6/google-sparsehash.sln b/src/sparsehash-1.6/google-sparsehash.sln new file mode 100755 index 0000000..6148fb5 --- /dev/null +++ b/src/sparsehash-1.6/google-sparsehash.sln @@ -0,0 +1,47 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "type_traits_unittest", "vsprojects\type_traits_unittest\type_traits_unittest.vcproj", "{008CCFED-7D7B-46F8-8E13-03837A2258B3}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparsetable_unittest", "vsprojects\sparsetable_unittest\sparsetable_unittest.vcproj", "{E420867B-8BFA-4739-99EC-E008AB762FF9}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hashtable_unittest", "vsprojects\hashtable_unittest\hashtable_unittest.vcproj", "{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "time_hash_map", "vsprojects\time_hash_map\time_hash_map.vcproj", "{A74E5DB8-5295-487A-AB1D-23859F536F45}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {008CCFED-7D7B-46F8-8E13-03837A2258B3}.Debug.ActiveCfg = Debug|Win32 + {008CCFED-7D7B-46F8-8E13-03837A2258B3}.Debug.Build.0 = Debug|Win32 + {008CCFED-7D7B-46F8-8E13-03837A2258B3}.Release.ActiveCfg = Release|Win32 + {008CCFED-7D7B-46F8-8E13-03837A2258B3}.Release.Build.0 = Release|Win32 + {E420867B-8BFA-4739-99EC-E008AB762FF9}.Debug.ActiveCfg = Debug|Win32 + {E420867B-8BFA-4739-99EC-E008AB762FF9}.Debug.Build.0 = Debug|Win32 + {E420867B-8BFA-4739-99EC-E008AB762FF9}.Release.ActiveCfg = Release|Win32 + {E420867B-8BFA-4739-99EC-E008AB762FF9}.Release.Build.0 = Release|Win32 + {FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Debug.ActiveCfg = Debug|Win32 + {FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Debug.Build.0 = Debug|Win32 + {FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Release.ActiveCfg = Release|Win32 + {FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Release.Build.0 = Release|Win32 + {A74E5DB8-5295-487A-AB1D-23859F536F45}.Debug.ActiveCfg = Debug|Win32 + {A74E5DB8-5295-487A-AB1D-23859F536F45}.Debug.Build.0 = Debug|Win32 + {A74E5DB8-5295-487A-AB1D-23859F536F45}.Release.ActiveCfg = Release|Win32 + {A74E5DB8-5295-487A-AB1D-23859F536F45}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/src/sparsehash-1.6/hashtable_unittest b/src/sparsehash-1.6/hashtable_unittest new file mode 100755 index 0000000000000000000000000000000000000000..d4ce1fc1fb12c4e1d8dc7ea66bf95fb5a801d13d GIT binary patch literal 4575403 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%0A~w=B7Ix{SOx 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 z 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

8Xw+?RW}G(c5Xtw?m&^>k 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%0DQ`Y>uY!j;5d||kgGI&AK*qV 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

jMpDSe2|!%R3 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 oyQw1~6Ol8KP`)8`)DV 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

ydXY zcDTkf^3d(wn~vqIRPSsy-8#Hb@Xsy`mc@(Uj#yqYb5$6cNw1u?2E5GDgK@`*Rk8%S zpU`xBgg}>im#WHSw$Gu4F;kx$8ii$aVqr+`YKITXt3r5AuBocdmnDjMh2&8c8uH3; z3KpuA3~(-V_q%48OEM2blyXjJ6VOE$OE`srV~fG- z6$ex9j&k;Z?K^mRb94-Yz0j~5;FZV)%t=s+=|t^>l4r!DDRBE@ReYhK1E!CV|3ae& zwQ|4!*fcK6^)ClwcnLE&5#p)|x)f)#2kB|uvyk||b^D>+m3kBD9FW_kv ztcZRZH-$<0v^eH-cI9^5nO2X}V7cmd;IbGw9x3{{bgO5wBKx2=bI&?>gIap5aYkMa z-iqyz)BSb0A0h7Nc{^u;#ze`|2Fc)*WApW8mH15J_H_}U&wUzMq!4y+;eUevxQ%lr4A`cBd26V zDkKijF+@UNCRD1|;$Vaq9&}mB?~>2J$({r{eW$4K@8}$bV0CMsqjTx4@vz-djhHue zLuRTUq>r86gG54T)$Bd$0YV@qq0jqk{TF>77=+#@pcCi!&;7{F-uT)a4SDV(%1k(R zfzBN2Q<@HZfPSGT#h>@v65FZ5C&ERdcJKUPZJGQ>(AnpL98&0k3Byr|GRmWKYF+Ql zOVv*D4)RiXL#A!zzgg>xL;q31x&(Hkf(N9OyF`q}H!ta8W^_!dQp}Vm%y=gsfuY+8 zMo%Ws`I$P}?$ye&UZm!KMzK(X3rC?yERKaqwRs#52$~rc?90UzLPJF^~%Qs8z>+9c z4-nbZYzv4WgsXYANQbW4#X;;&Pre3*ZG=%#qkkq%*#$|0?ew5aY(Ej5Bn2_&d_|3f zfG;jFJzcZTMD`b~>{?8>u1FU<@f|1Uz3TOuGseZrBA*aNkb(hXv#YZ?Wa57TL0dq4 z1n0Ll^HErR2bG-!3nQAi#IleTX^2|TI=F$SdA6;YLEee`jbfI$xzW>;42W&`xe@?Z zH1W-h!DZGgqG{&YhF-gq>lQ;P4Nu44uA_6?gTWqAEiSkQ$C}M1si|>prxopSQ*jlh zcB;-6nOZggGX<%`@Eu@{L^s>J#K^nUq;mgtFhKv;8Hjysj@v`kK8V$)_2e7ByP~m2 zGfPq74h;c-BNoYnItXiA?5YI=e!HwLOr~}<1%8whZwX*IFR`2P;e1}R(>@1ETL;Oi zDrgL#l{z+5FQIVbu>b)v#>@|4ueu<-uiwt+s6I?mSMxZ?sDMA4F+@z<+jU_z%|+o^ zr#u6 zk0mba#Mg4jh*F!F%qeoyH8VW`Iwz9*n8y!zqt9_75dL0ESwgO!^LFHIwe+~^k zr`hOOQE+pRLlh}bL6!vtOjI){rYTRsfV+Q{eU3)A-{%*%WY@I(k&3qZH1wlon)5gCJ`RIYJFX%M8S*^Sz0iHg>V zbyp0mYEs6c8f^h^0yYU)T_q@iJ&AOhvyDBEk^M8kq zD!USjw3*72Uc&ndWRgi_Qqz}+CJRs-lU~}`vgJEQiNx35RUiroCyV_-UnP+ayOhgr z9jP+>8>Y!tC6UlW)1M`R_>5qk3K$%WZ05ibJ8lZ_PWgB?m$}!Vs*$)%QeoEK^tWQ>?A;M zlO;|SQnl%6jqw;ku6L2PXJW4hOlL)$;isz+(S^imakd(Vomu${wWWIwCG)$(E>vU< z2Zz}A*iGtGE6%y@>-o0Y)?917IN#?kQU1KuK&3J}Q(PjEM_c)%4pz7Z4O?fJ40gYW~ z$htE_$CwrB+}=&>loP0Dq*`Qwrbp7MR7H8+j-y|MLC9stOaN|dQ<55pX};JN%k>Wm zVw;qS5SD!+o^joLB%&}R7OM;>ZMfoefHKQGAH$(8j3T=T#WIYV)Y8fH>j)AL0a6r3 zhW^MDeAO|x!#d|f16Z6o`NO&J!720*NYx-XOKym7v1k=6Re=Zu%T!+m#68O;GMrP> z&7DB)$-zzI>{hPh-W)AuSGotsfattBY;R*aOnbe9$@s-bB4qOXLx2t(1&#g772pJz zP<8a0A@BYVeFc*t`goJ#I~!6bq!Tc60`A=HJc$?|8l=Isv|@q-*GGfl$vhnzF1@ z@cIK4Rza!wZ#DdW_z3DPK7{}oVr-We1!QW|j!Rl8Bw>!q1RIk)1NeGgYW5;n2#gJ4Pd-Nk-~ zy5Y`f47p&W->voYQ}etvDzF=>XR*75;Vg^@&-7reAO{xSV^X4+N@iZezG;PH7Z-|C z5L!^M413_nb`1fOHjRim4P&9#-EdU7+QHr7*~8p|@)`kLw3$)VIhWJ}z3E)Ew+>5N zvWM;ozqp+M!h(YSodMWa=tl%@i0bukPGNvl!wrcAW^I4P$~wrpB!D=DrDGG|ox|GF zSa6pGfy~hId7Ogrc*1ot>l3d$dnR{yGxBxg<-GtW9lAOSA6Ow z6DK+9+iZzN@oM{~HjVB^>9V=v{^npfEy*q znDH?w8upzDQ-;?ar0T(YBnjNHu(fdyUHvx^1r?k!Q+Nrucy?5m?fMWDqjFzhW;64Y;vM> z{M{fv27jo@^Voad?7%4^*yOun5fEp{J`Lp>->K{KtgbP{U`oUZ3?S=gol$l$>~^}~ z!_#Za#Ly@SaQqm@fk0w^D@!e7pUP`v-K0|W&AkRu+b1D#EAX6La>_{&dOaVKRpk%1 zd;RwCcD9Qdt)ONaiflC(=T)_!#7&-}poi)7lT&yHy}GJ>?m_<~8iRlDNS@r(t)oc! zRAGi?f<{n`!>K;%wlPv2;>t1BXU-R?Vm16Eel3NzV0&8wEoHuTIC+wdiq&1sJeOCc zd<;%(RF}k|xpVBBt0ury>G+Q9%^$}`7Iha{8`L)#*m$yg8`RAHL3>F27lVZOqpd1r z^|82+4TjmuQo50VH@3NTcKwlTb^RiwiEmwb^vsr52U*#DwzGE-wWBS`mGE=Se2a>3 zD?Sh3C!l+Y2;6z|_qYb5vWr$0!^1$KK-boT+jMLC&GvAoEM5_&+)}u~7f>3HtA296 zCmIn76l7M`?qv)I1t2j3p?x@u0lb>Y>H(Nltr-n-(SQ*LQ|Jf~HQ&x_`ORps!Ua9- z`Qf1h5F0im3p_sfRGp4whCgBn4R*-vEHcUh1%P+w@0BinkqHNs+gX}#kgQNgRk!Um z`yM>D2;ChciyYd1WLbM)jhqNDdL)WO0v5$yLqNHWRG#n9Tfvfq=-s}uEHYubKtg2T zR!@?~ftSGfqW-eGGojVR_yn|4QWkUA?o%&!3RttyvC2}ahl7fISFbq{k#3t&LJl`x z$RM54x_Qz$(Hh~lxpG)=znWSOYQnJ$c1TA6sfRP%aXe1Uoo#U8%8qhoH&17<<)ZsW zY#I1W7G>RvB~gAjd|Vy}D|*Gb&c^$z*qKOIFzEj}11dah%;Dpa=!XmHDd_VQkT1tN z^`Fgnr@}ydOXeij8|KiM*;oa^xTJ7;bbVwHm0(C@SLfmJwrQk|0m7-CjkFs*&HP+ERl-+3fSU^UF zdfGEOy-{15Q3asN>Ri3c zR`BjnI$N-`g33J3ZkP&rI)XLR>vYKFfvugaI40n&!1aS{Kmcc32Pz5;%4Jx!Hl{}W z79fDkmJ4)a?Mvhg>ci}f%2ZyBIXJ!uIf8 zEsigRu)9+N(S`Y&L$JXBm=6YEu;5YyDp-zFGlC;`4v-&~h&gWl9->YIF@$vCsOM&! zu2}YNtW@3^4zhfcTu8Gl4y5 z+jp(2GPa$B{(KFE%P%arFV~tSsc~l_CtW-2M8P~fn$c2oslH+Ftm?$jQ1nG+F;Bp9 zS>8184shuLT}J8r_1cuEf)r@?>#X2ipkmc+OQ}1oqBCU_1QSFRnK@KH_10}sW`(E@ z5N${li06k${|Yi$Ox1)X&pqj!4(w3IXCCp&{9$-xXKjT9kT@6|5OMEn{;3&gdv-kN zr>h)JOG8s2>v>iqJbpf^Vz<4R&kD%+a>^}ld&H2YK?zChLJs%o5!ixl1xE_V-<1E}r7_9l#!P#Zyt zFx+#Z0*B}wjh2TLmV`c6*NLmj^KPSjH?M(<_0ZlzBt=G1l6gz#0Tc(HfP;_w-Eq4F z;qqH5t+auH7{;;z3HY}+2F2o^7usuEF#o zy5h~QBsGVx$f=t#H|zU^>}+i2T*L3IoI%HHg&k)t4>g@0K}uTHwW%JcX0ki?Ze z1r)+TZy z;m}!e_dp)lU2*HlphqYcz$ir6-RlBZ2YKf^?E_$?qj@-#M27L9N|z=Z zS5EB}2R#a5ouL9}Y5NktuF-*-g&>c;)R`x-D6a2}^mK&fpXlHx^9XcQZfezVgLT6y zp8ndNxOE1K7=l=9)y*}zLc-Osq7dojEQPbz%*jIc)&X)N?cuO}JH3wFRlFPp3L`7lPUJb|fjOz?le_%H^&l}>b$c;+ z6chz-s!@DX&#^rvni(GA6V7dEh!@32D*nI02hwa!hIDgtrzhFe=B6I3OrU^!Wpy|Z zK88Y^-qma4{Q=}&OZHx9cfwO_KLxr2uigcB3SuE;VgjR`!{M+MT!Ts}Ix3-G!AXi{ zI|&Hu8$GHjTg5|B+#X*6z{Bu%&DmwDkaCwWeRKsTd^wPfT%AItxgC5Og>mf<$dn9N%^25q9x zrmLqPy|@MW_NT9GtzSNuJ^bjI3+dJ-nJr$Dh+AMpXy%~L356AnCq}~94FT6khh`zr zEK~*ls1t-&uxv{0I3(Zqx+ATNfT?u)hVikAlQ6g(3fKdIaR_ZepyZ116rdNwGT5u5 zNbMRz%(KIoG$vh&0@O1*80KOJm!cD}k_ne&!SoFeJJASzf>1rc(18+1x^@}6kn9bB zEQJ`dN)4jgRZewu2Nj+oBdJBil^7YCnJJhnTCW@Jy~8dfA_M%7d+$v}#a6cWk&~C# zS`_eO0h`D23YTM08|Cb<-|It7aC@)!i7qU8Z*T9E&a51EKb~oaSQRVsS#VKm<$d*% z+xS`Wb7f=NNnS(0>iJeq8M|N9VQVNI?>BURa#XXw4mHCpuF5OnMsk|*IYMvt*I_%H zq@=Jg#4&%W$3Uf1s?{rSXh8CFKZ70+Y8aU0{DaE*vJ%rMXjZZkWmVgj>wzc~Xnd@* zO2ghk?iLc>lqnvO%Sc4PHHL2rcg+}#c)rMOrz$6#%S^cI~9D|R34g;WE*zSMkQ}7{(`_h)*6cLbT@#y z$ivQ)-SH?@fnzou)y-bS0_apJTOsw1fGx-nv{h>96+G_F>M3w)To71AjB@cKV&`tCka&>ozCi1@{hKut8S z137@RREi6WMA6YVvN3adh46n~Z)dPYs-uRplt<_AhpH_y#KM>DW6g}H_+x9FDpuEm zxS^c&3JAk<=wk>2ybXHV=E%VL5~rpE^i+DC3Ps8~KgRtZBS?g^)dbzRx8n(NmJ!P* z7b~cV=@iAu5CEWJUOBx<9{m7eFTLpbUj68pZZHC9kGv@%t**C<;@V6gBWQ5d%wx?p z%)+@Hx>EO?L6uNL$N?!J#Dh*m-mxL%0{Hqij5%ImKy4~7P% zszeIp9E`PA!gdDz97(Q&L^M_NW5O8#Cgd1vbgg{b}8dx!iwgru_h$gr4Gn6)}~)3Mw>=C<{!%F$c5vv06gY*x;oDX1CmQw#XLHMEtQwa&q`Ae2yl;8wNSkMu%*{j zfpD@kf>w)=gDI*D>v=k6##Y-Q>Bo^CxQuDkEy?l>L4$9)(P-6T!jA9v`k6A@l1$1M z)ETD)mX+znRb_~@k8SVMwXvS9FW};RPl0{FGzG*U1Iuy{Otr~8RRZ|2CX`DuORG|K zs-x7cnF^ZD3&ma$bVR%H_q#W3%M+wpVtk2bcWS6;?PE{KujDJ!@SseBu7zT}9wy~w z+137G*12`-<|j?e1rT>{Kp^rGEl7H(Sm%;=-{sSMs$Bj9+l};j>YUP-^{Dct$h> zkUbE{+K3JlvGfB|CnOrOh4F@*6&LftH`b)Nb8io~_PB-+gWO{8oMYhgc852#)64ie zoTKr?@{FgLEjbtd=2a_lw*{5A7s1zPR>YTuUEnUd&^d^Y}%Hxm>1~>%PHJ}-1kUj9gk5T zbr0i(FdG~Hr5OKE#+$8Kk@`^2G=5RK52{U={)n|HJ^x_UOh8i@9HF!LrP4XzIfwfa zu}v0Hfq+7_E?bW0$d=Snn^(k<_C>1g&PwheY8(vg=+i6UVUF_ zHxX#*0Q`t-$)dPIS}0W&uE4$%Td8PFlSQ}+DH{)FLztm?! zeC5ur=863QT>rW|9PAU*k}O_=pU)2Z<1>)Du?49AVa5EI%@#A#;ax?@%2pf!bT_ll zO-=}Sw0ceJlNCtXeB{iTM>kGiKJ&xb>cuS;41_F3u9>LOW;UMUEmnioms|JYubZ#2 z`9NwS`2?{X85~ZJ6SjDQ^)u)<*|KIb)yGYg6^+ii@15H;r`fGXwxycmZ9I4zNor@o&L?C9?zclF#&hKn(DJSy_fQ>{KSSq-9 zRwkN}7Hh9>#C=7rrl`NBj#X{VXIq%t2@#MhTT*lBGhK30tt%IRDW_YNVN>D*GdeMF z(m3m3iCRqw+h6E9vZbE2C(CI+tT==sG}Ee0I`bO-lb{`H zX>BSVO^VN9BmzW~x}ZTu3l)^wGYQpb9$eLQe}?(o zCV4X(9FAMM$5=BNp8;xW=CSv>m+YK8X%S{qi#km#&Ipr@cc9hh`~!WxyHh7+(B1eX%uh&a?pVic8Pvp_u7_S~1ah-CCRy&3cawnU~@xpbjlrY<26Swcot zl(d^RC*1IoscsK0-LLTcx!(-&t>Am70Jthq=tgU>2aS&p_jMI7tsWnQ9G{)_-Ch?f z>SYuooXt#G>jtxE3LOcOX>e2`F@IMegG)zN)Ur|&OOVUTVp-e!rbH>sE)mRX<@bh; zhYtGl#j=5B<;X7)JEp6SSDr|JR1B8t%_&>y#I1loma6fqnRQ9+4l!*J^nN*R2XzHp zgJK!LB4BZ|I9Y+d6w+5DWtb)3Ywh*=(EO$EK6C2ap)k&Agvq_vU~;0+=rhDRtZQLy zw7ONKA%v13kl>MqfhCSBlVCMHE6fJRJ*vlT{wr-$noQhDl3kpLQ#mz+(!{-AVNpaz z#6XIfF}B(&?Yc!)eK@$8VS_&Cvn7t6h^_f9li)~Aq^i8A8Andfaq8Bi=w<8F z(Rc6Qqh`+wiC87cHWz?{!zWfMIoLFL3MVM*00o>npaEc0vB1iZAcl}Rkf56Fls(FN zuWgtL^z{*A)mB}y&C>HX6Z?9J?^SFI&$*fGjU8Sl$&xt zCACxu)SBkDg9Gqh0ONeP#sB(4=3oD&>qg|HXkiY9g6?}`^!k@Y-gJP|@3flm`=ZXI zY%S15IsAx2#Hl5_>MR*6vT`31g(|?+lL30aq2$EemEHCQd6G&!Mw#f!Bd`+$Cy=lX2!f6rCo*pG56&QH z2ytz?19r_&LbWpek%&aP3*J|j_~VL$=3*tzVJ%&Za*`V9EU|JH6jdf~OLLhGEZ5D3 z?N^0f6 zdPg%mYi1+#gb{h4w^!D$DqzH%E@9{L^o8&0SJbreE(feM1?on%H2E49Ug*i)#ATjs zZbL^ZoGW0x?B6}~;3u|6HmBMuPob3)m5EG&R492^5IP|=?R+lpq~*{x1=m}YdF?Q( zCr@ItN?KH4w^S|}+?KkT*>?P@e+Ar8Gv68CKIp2YTr(0XzghZw95(2+ zMz=@f?!GgUa_p}&fEm;wED%*?ch#QVXfX}!$@(c`_>ayJ7q4569-T{XjfZey1^sf9 zTIj*=px?7P%hMp`TOU7fytWqUood4E!Zr2J8_$WvfuWJge#F`%AB9Mmw=JI66lg0ly^2(dLw4DZ`Jt zFe#`GK(j3om=R;;w<^}VdSZy<`JySr!gsnHi!wqoh`pxQ;j(P!d=-J=+2tuG6jDjfm*?u3$<_e`kXRry6S-`a1v2BQ~%2#NgA@dubBqcR4i6{u}^ zlzes`*b4Z2LR&bJV#iitKh;*_t{9N;v}F)#*4R(2g`|@U_QqimEACNk2U^^cw1j;f zgTnU7^I}~b$4MXBr?BZHaGLg)q`kOdvaoKM%2dRK9Uk~OO|#AH!)u~7HYxXUXuG2w2^;#9-}?Ku0>D)TP1 zAKs`(qdX2tkBFmWG=N3?kyu3CLuHDj;bc&R#1F}ZCU2u7I}jxEwpkLoB3Lfz^^yX& zrfQ!Ng+gRMfcSdURs%t=>4u+gI%#98mD?Frsc*MCPu^?~;T~{xL85KiRFq5CRD80T z=lr%vaeJprX+-lOVCSHz!9I3_CVnojm4Qi@bMBW`N5o0Io1~DJ$p@PnheRstfIJ^G zHxn=kLr1v?P^$l^ooq&2RX!#Hz~B;lz7 zfltQn794Ay?OT}8syr|R4b`=^>UL{#l$*U#rGcDW!GshbiP;fg%PM1o;|rT(B*dr_ zkw`B{lEVW4kDOAe%EUy1g24e0fkIY4+k_04&NvxC7f$HI4}Z1~q{jRZ=%*H98(@7C zlj#68d^;)_;KD;cPoOfVlPp&1?&t*NtFmM4LZqpR*`hOgDWe*fiDgt(E4s@G{t?q& z$i5XUD1b~|>z3x>twoJwP^4meB5x*S9ZjC*V-U7Q}n1 zWjT`t>_f*Fv8mPM5e178@p)a2MQ;xnhg*Tr!j7F11UTCOn>F;>58|uXAQMm?;zPHEVY`yh8GR&9`>OsL6F}K@69n7W!dSP_fA(` zPtORsA3CsAbjtVJ%&v8BxyB)`Rzm%z)yt_i2;A-c!Qluf4lL{-=hgz%g(c|Jez@Nq z_Bt5^J$vI3M6E%sbcc|3mn2!%8^P@dSNq)^&??z>cXu%CLZgjwb^yxpAlts3fy>nC zx+C<>m&a`=b*h7Spv*zsxV9U(WEMlvdaf3$)^Mx1#Y~_ys4Hc?EHY&US4EaWTpX>U zwXIx&fMlfRQzG+qCuEsxQGiL?lR@|#VPT6>HX@zQUN1k|Y$fuahVwJs*pLwgOOByZ z)d3^dM`@&*0z~#GM$C0#SS1dRV0x?rgmq@fp>g4dFZ{6m)#7o^jk_6E+3!N~$mklL zfz1&_S-J-RGB0I2y%BUfrBeF#dWVh(Thh>Y@L5940gy=&MJQ0gVC!}JG>I_<{AqM8 z{d*Pa?~4DVU|+=HC(tjp1(c9$nmAU(8CVWr3DzuTqTOd%Oavr#`&NGBDNlcx(^K)d zYJn(EYGwJT!QFv4U55W(!km+6hA#XOlo}jw{MbY{cXJ|?wW2fUD}Lb&s@FEHe#9bsj7G;4iKv5%lm@I zR0|FbbSc2Wv5hE~ODJf96k)46bJVS&t~DuBab+jBIE9JQxz|R%i)~;9!M0pdL8Zw% zre7z%0#f4^LrGT8B66jW;-)5MvN=i?07>s;du_PWaj=Uik0X)ERn4=EQPL580gxx+ z-UR7e~i#UMQ727uooFUja0%?W5 zlnBN1yUpCI+X6l{A?mZ#Dy!TniLKZxtgq>`-ezdd(~?VSodqY0S84c(ZKwmdz1BY+ z?>^xUSwTY{xqHTkPB0{Jdx*nIj|yw~k6p7*8AFRShUqx-rW~L72`x1;I%Vbmx>#E{qv4 z246aT1s-3n(gBq9uvq+TwwYpODqKdOLZl!Y$M`xT(~Q#Iv;{Z|3qV9wTeuEkfu4zG zt(P{E2xe1+Mv0?Q5Ki5trDnlfQ~>nhtVVan=Q4YNp(Q65kAAV8ja|1?VPjZVV~nIa z8t~~JrHNp(ipS_ymzXv4)t)2FLi@$|Valx}5=A%^Aur}lE&422;#dwd#NQwt4SVrq zoi>E!2E*H)UU52(@kfI$fKKp({z=F-FTKiJlCrEUdRDb0E0rTdHI$sSJIj~xjh)bN zzRLK7V^O6ifFmnak5}!Y8v?R{`JuIs1*ppMDk~g3UpK%Rje_vfbH{~d1=l5$QLx}= zf|Dm$5`V~`&dMJJ2hS4am9`zVDWo!Be{rF4!fS6F7pb;Zm>2>YkXgl61@@Wnx|gWI zOs6qyu`~@Y&jcd*Cd&=03X1#rL^#w+TVZA9PMp9Ss`5XgJ(cb#Sb2-_?_7>TvPjGq zIBLCdZ_p3ADpZjVv*o2&Mjs;GQy<7I)dyiYTi-v}OI9#huY0fusUq1f{0CmsxjCP0 zTmS)F=s|7?X)(469&ur8;9Zu{s;MArNJ%oLW{i+C3Ri-1ott^V4986aG}gA6;o^GG zlWd89QxC3``rXXS?k&3FL(xAyd2&;C)u6R~H_6M%A-qMdc&No_Nm ztc<%5$#5@VGb)!dJJHs<$>$99(3>?y|CrW!Nq2l8{uq&p(b)cEgMUdfdT|dic$Vqy* zI@ZLALE9wWEK|lDid0U?eprg>AvGNEQ%xZ(o8JqO)_3&v1wm?^tl&nbP105o{X65x zBr#08ySZd()e)XhFr{3ClBj6VHt|&S<&lvZ)Vm*UJ zwo9FYZV$l-12rM=C~6|@;~9rj7Aid&GYEP+Owz-xDV^KQbADTNGbm*Nr#>#qbvmKX z1*f&g^M~AKA_#GqhnIb%3TV~_N1JW$J*k>lx|Dd}HW}E43N!+0d_PJZ#F}x5g@p2_ z)YYBXSW~60(Zxrbva+japa`x)_!S>%5MH&&OhgibJSKJHtH?2~k#m*1rV;H{cTwlt zJ2%?E7r=dOmZp&8fy_HFdu~(ZYq|WFGN)$Wl`@g#VBf}mrp4@M_;R-ZpE~hVQg^YC z8yx;1KBpjP^eYTIRHTmKR>h_9Vl5V9#5IALbbZT+$ORjGbEvEYAi-xLMFG4J)!W@n zuR0On7(zn`mkYJA@;^ejG2fJxc4DYD?2Kt>vkoZeVrqS2R^GhrSqIXbM z>e0C~z;15B-G^8Zg;ejbvwx87_B#P}O`oT{Q2H0_zY_x|RHe%K?d+oR;}*Q-Pm{;& zydndosbc!(5dk&rtVi)0nMY_+7kglo$M?;*ntO5OSigBUjM#Na3i8!zoEk_ComF|9 z(N`j3=4@~!86ugQI#Q+gZ|dim2+!0{3M8tTiMk;n1mU4y*Kod3kpqXi# zows_osRyetQ>jL3=5_bB55xVCrq)o1{#_p>j9A`#iuvTpS>{UIQ_OqWc+l7Z)GF@c5Q?w(BWubdxM@A}6g}5P=G@9QKnPx2J=urQo)G+_Rk42k)DK7J2;xc(d zTsj<6WFpL3{9#aogk8eqP2uIi4_YHp@xhT4zmrn91YQ^y*H>(*O7WRIgTlREp-06h zZkd`_)ipE1Cq35Q*@5fwMp!Yef+4&~;ZnSVLVqJ@CrhMTK6_H*cA4l`faXy5enpct zkz|Q}jV^EcAz+(7)*TK`53d^1aWJ%(-8j#79&++zig!>2c9}m?@aQ~x#^JK=&Jim! z!!x9HnPw3LWVRY9^&ZQe524 z42EtU*f2H_=R1(@hkg67J!PF6Dqr={3;^IrysBh8ckz*jPhZTk_3Y+gxHD?u z-DX=?lG7XOu|lW@Xj+=jzHT}Uvz$Tn82akJwwoO6*k;7 zmW7u_7G3VukdzeN@b&I_1%O1l;xXdGTlSntcX81k{y@qJ@1~<2x4x4KCUD-f$PNn4 zX_!82kyTkqsYS2l^_P)?QXQ~iQ=bPIIe6x@`|$*h?pb&j-zLXb!q_d8(hyH%oA_K? zUFVu616(K1k8<*_IA*82I;d7)75XT=&w(UZD>4rJ!~R#-hw|Pz{gT&|`|*5{RNy$uV$_n#&F- zmve&N{gvbWu4j+h0C6Uy9(JDe5;6k$F}WDklF)2lAki!#&@mC0+4uPC)Et!cnm6eO z!8`$niy2~$bVx8j@?8ZrG((9?mTnG#gv$22?Vcb32JW_tEGQHTkg2bHh&_vr3D3*B z!$F^_6yQE9=okgf&8XAOvX>ZR-Oy%1rtaA7RwaZlm^yvXkebI3SziLtF=Gopsj3dC2r6R>PD~tf13B z{f@ORRio4uCdVKO?P*}$J8>H)wlSR|T3GY*)>w#Qb7~l}ZMPeh-?pq%lekzS#IDYoL zWl@!?kqk6md_q^BQ1eah+~hghl~y|%VgPxo(}?f{H46qivX2D+i3~iLgZ6OLwe5tQ z#y^7Qh$%M^H1%=u$tr{hH%qiEx-$;T=1u(EOxB;CSefWAgHs5^Cf90Dc5g#{pXWRj z(CA)mky*zyRqVMcqjr@+X{VTE8BRWN;^2SdX^$xYb$1L?9pTwB3a5tZ4N^OU9fwcU zy!s$nSli0dOB-81oULBml3fbLYf!OAR9NV`pdjdsQQ4#{T$Bi2Yf|AjHYR^#!oy;< zavAek=mm;o*T_B4EYo9sU;K<*%53P z2L7&-<)I4eu_Rvj$7ig6tlDtKt|u>#TjVzMG~hKrd=celH48#^1Nd?ZRimvp90%A? z_La+bO(QT)IoYGuA||5jv@Rd&3XWF+glCC^37Y>Io!^mJR_ZBFan&ex&FLgMg z2rDgyfMBZ*EuAFFnp1@-cv+Ggcio&?XgoPVm;Lq!2Lsq=xUIN^88&J`MkMr+N#Z0f zf2lOy(tt~Cy0SAq477OkC9$}Ua=0CX1UMK2Ag-GqYhoE*B*P0J-6s@@D#VH@*2+Ex z*LcHKo3Y?p*3P|Yo=tKMKSf)W>u8ywa`VPkwl$w!xv-UFS70T!fJCWyP77>>I3_5> z@Y#AzV!g8hC*B>MlvrLAON=KACIS)mz6zu$a^4-Ygq%aY7S#KL1*Y8#4X~4T6l;fKX!$sOf~S^i zc&+($+o3?Rt!ZLcY@W@UiHCA%lQf`eg~mFhq2@+z;{~GknuoCI^%ke{Yhb9*TNEKNF^L}m&t9P*{li31$ZTyeX(P-v)O$cfxhjlQaeWr5 zM3MP#^7by$F|c}W10P#)v^dVZWVE~!X6EIc*a54t=87sYF^5W()peL21z!#r-R^?=sg-y7$&j_eE8XP_4K0`w;;#m^p&mk%jdF( zA3bv+-P&~R$sKg+Ch@xXkocSd#m|qqaIK#W*UFd_rYGH-5h`a+>c;yq&XV$+(%RnAB>3qsfQ0glFa&~ww)Aw zB5G3M_rkXFl=+FCw9z{7-=x(2s3Q^O{wjMBHO#;aZEv;QLbiEa&__;3q>Sx2){`LQ z0pz0`lkQ%3zuO;YkVbZZ)%q+ruKL$nnA;(SRVhKJ*y~v1?1Qn&lV>tJ;Ys5?fN{ev zL@6|@1ekA%yu!P2yklZM84oTfMV7Djc$Mr^ZFnXBTXY~i@ulBMv7I24)6lyrhYxUF zs0wGdHyn+Za9>&U%*K}R-Ns8u6}_#3(iXDBeG7w(Z7f1#FT^*P0w-J|9#kZ%F-=6V zjPsAUV60VK;jQS}*AAj^WYtP1o%KM}oh&SyrB#s11@=Dr70~|oDj(gY;ni?f>#j?4 zb98bjww?#)Q%?lhAV?MgY9@#l>jjT5g5pJ4DBvKcJcSbI+e3C)I9-HM`Bc@@|=O zWsBU*v{hxTHRka{r#Mf=#IuF1YWDLDxb85a!rUI+;~mc$&|IN}NIalU_{C_S>qx8s ztCAB$;l&9RYb5O;rd(_0aO$EI%55USFln$d1Jz|Mi#~!*`=zY2H|Tc@%>}AWk<^HB zwdlMk?{)Gp9JRopx+*NKb1g>b=tm?i3b=w;)fDYkyo)FFRcA?pt2b!xbw_Yt4p^%U z_O;gv6}N(C?_v_587)Kv2)ptP5OldzL^H!hmQK(a;l@(Fax-rWEK@U&y@OO^Qv;Tn zE{ZDxskyiMK;Ix$Lms*o7t1U(x%xgE$!FGZ8%@3J=v)rH*VGGKiZDVJL=Bs9aWH+v zqzUGAwW?97SsFE81P3e~gF(@ygN&LA^5OCr!Bo>QoOy42Bz|UmFtw2wW!)fUx1uuf z(z4nGOjp6q;V|1MMD!;Xbmq}cr|y`e(m_VU&JSXHF#0m);EXX0^#dK~lVaoPevqO{ zeox&Ttm^c1ZkC)oTpjPNQ=!U9SG@oELF$4$pkOSu(|}eW;Pc3tGmmbZzI-N91QC}` z9GL?CdoD}hFaSKeyze^+Dh=n7*s*!n6%}@vnIaG>ddwKlq(D`8PM6DEa=cqz>L<@* zxaSe4z|9GVHP$J3Mi*>m)ei!3HSiymF5cc$myMh0>wQglf_8WcM~ijVzg@tU>51>m3j!hdF4I=sNL1{DDH41x=th4r+52?4aJMl1Fhg zqQRAN>c`V0Ha`%^cS2;2uXBH1grfC|h7%>fBmv$Ujk-5R_P+Q>j@)8@leGY36lL>_*iEG)e_ zyVXtNsGC7^uxMVmFtVF2!qeExHWu)*MMT~T*4bPJ2@&G3WW@oN4{-ymp3q?h%LcGB z$_M*u50db`(uIn-^)*y7%poV!p4U7ESfy2lfQD^*AwkS~Pal~1Og6=_FhgM<&W2WL z&>@)l?S*<`aO+>ibYg?5o7`PcI3u)+L8c>m@ojvSNv4m)5{Q~sAxT0CD=#y#j)w6Ug zBl2L*_HmgjDaGq(cjHV)jm2jU06J}mzJ{Usod(zP<)p&I7l4jPVAbJiE7WsWNVHT+ zb;6$8PV!{H$+J4mO}3=CyxPnviJCr8CIt>jNb){w(fY!vI#utHmZQuNIA5Q_Q4Rgy zW}d5#+|jvmADo+hIq#Kc=uRfjIfJ157AK9&X5ba%>DdoCnR(7brq4wSGIH+zA*+m< z##SLOP(UsXcXALp5wS*30B)hl<|5T?SLo#l9$7xdbFE71v-kycFUh%sxq0xMW36+m z^T<&1T1#xZP=G;&Z!jk}JcXo!?Y>rEBkWMAMOunkHpm{YNbh3BdKXLRoOw+r0<2M? zw9B#4Z0O6ons{Cn8gcP%LI*I12qrM5FP4Q#vf&(95`cU94FZG%jGbe=ck*f0(NxEdT#Mku-JN3x=dc#; z^>@axycVAnfEdlHR>I5;y$jJc$E_C0i-fTCcnQ+?Mwse>!Akbr(Aa^`>r}_HUe9r~ zZ0tjII$TzK)pU&%>_eeRIcIKQ!UUH^nVMgl)gXu@F(2jFi8;-9c+ivy+dNR((5WoD z+CR)Xw{D$0nL#7R;eLD1X4#VnniQ|#6irRy8w#I9=>}cglpl*|=yla)yP+2<0Y5r- zZ>eX#w`!?Do2a-Imd&ezdDpNOu+%{A``$xN^aKJTPC_-)ae^-o+P@^2L8gL+x~o6O z+pQicE5zdz8`6t(kpvb9D^3VPrpXFMPqV!?L?`=$G2}?38y7m1yls2}>0-MyRk>4g zQC;oG&x+Gqezjn-XgWp=D>McY>M@ed65A253|`nknGUcQC3~`qc z1e=w2;5u){rWLr4D&%bvIdouO)n$2`<8Nx1syB}vljwYr`e+4QiKV?zavDpKfbFQn3n77kPFZjZ#9cz!28xi8s@lVPlGX@?84~6o z;ylr#SU3Y3b#vSvA}=02hV|~}SXjggdFm0=>tD^F19}^HnJ#wO-t{`P3twEJ#fbE{ zx>;jLsEw(cCYl2-O&@KAEoD)p{0<+~rHKA>IhsnL2jj#+RKvd*Ce&DF6AKPnWKnCX zQ&Ez`G9MXKtaQoDt6GLP-?9Rrm6}Vblp&vCQBBHq8nOwr`mPI6_V6Fz{?I?^?>6mE z{Y84hwzCa?Sp!S|YxFFWqpu!Czq3^W_{)kENRuzCT<)mGhgE5PG!G?Ob6Tajzb`{v zrDo8GxTB9#dJ0|8(+chZ<(-@`sN_q{yT-Xj_u9D@Hwwc^uqt0MYd+1sy8$iIz_I6U zbR{^S1Ti+pGB3dgw*deywJUMfHx<% zhr{;m^g1r)F|cplt3yBn1V7vT@%r|~?F3Nyqy!=GFFJVFN<7yACbmU4H_+h!`DNUPI-PrdZa*vp~<1?vU_Z9>vLSGN%zpwu9zdIj#Xfd8Nq$TFqRvOW&^@);KL zR%4@q8<2V5zVcUGd7T2MBoYncX$6~Ar85Ck)?&v49aeFce}V?%yn@!)&CZ#tP?E_*cfv%N*eKNJ)a?Tew?rW*Y97dmn5LF)dAHr^j^Q?|tdsR2xFD*% z;>M?jjn=sw=9Z6Oh2W?_)s*O2U&9vJvq%kiA=KOJ58RE(2OdyfRWZa}yAG@RZ5#Sz zEgq{x+S@cBQ~;&QTq}V(ae7}u!-jI9Iyazlz3hTa|8k?v3?g0oy}rH~jnz$PLkxO! zVNu0}0PYkslzhVmzxD#;!QFs`vAJ_n^OrL9y5|G8zfp~J@@G8NGDqS=pm%~Crx+R| zb*WNF(AK$4W+%y_`!LY%4%Cv-1`uaMf#ntoxhkKt%Y67*`S`@>aVxf<7)rY;QSlMj z{_)^YUE{}FCv2lSd1VDuNwPO+?_{8tApw~4SH||XMbJO4^?>We=QEWeoQ#0N2TqWY zK8&1MLO)`VDEZtRsip!Gq{4XU#WP@{1S?A_EcjsPqz1|D^6rVNqc>7IwC+yd9m}|)_8FW~Xl+XuB*1+L5TM^Lk;>_{*fL+! z3LQou6wpOHh%a>%GE1CvW&D^#avUP!7y|_S)f@NPdzguL9rjONn^))Vvl^PiAz84U zfx+24m+-7sPMpylZXIKmuk%X5i9e1h8o;^@Y9$Nd1R}tzS4sacJTP;qp-eIn#Nzj&-$%5c4?!^C*9gE*fz%Gvh9sReMX=pGSG!M*f?_U!?90 z{TF~AWDA9V0tf}r%5kQ-xU2zF(iV{($aW9=opEo_*EmQIxt!E;Ek#Ac=O=bmOI=p& zgJe55qjK8w)uoB7bdPfBO*|4WF^sK!+LQ3ANq}3J z$_@PkciV@1u(!QV@s*}#SJ5~CGMiZvbG2e#+*smB@>h$#EAAWrxl`L zqi*T#)u=Eyh;?y$K1~<1Y&%8vKL7p}g`CPNvmB~~B0Ze#qw2dfy0Ivv3gr@c4#tH+ zF+1Ls%GGj5pPS(eLwa-s$>q?Sp(=$F{fg7uK~BTw14qACP;+U=<2>AX$i2o9xNFm` zg6l?yrgTAR#A{kS#OlVebP^McidH| zWn@g`!65TwMVQ*VuDq+{66FFv7L;WaQiuL)&5m`|3`VR+-KOH*!2%e*6hPWem+S!Y zq(D2}>g^xyL-F4xs`vh=o7?y=sE8-ki$Qmt@`ZhTkdCD5QCaEPXWC3Z`l9%Bc?+P* zNmX?pt`hdj2O?;vP(>IRF-zR)B_BCXwHK|2owr>Fapy&FEKQH;dN+vB>ymf&BLqUz z;TTKr7@t;r%+5W?F)?NJ>Ry4yh!)yyVk>MGdsF1atk@RLY)&}x#9+iGR|M*28gDVA z_zJ|fz^4)Z;#4fY)o2x{3vfwEah}Pb#1GPvpc^Z&BucZfv-&kYiINo|%b3nfX&1m#5uUp>zKGHB z);OSXNO}N|Mi$?|+1!R%Zrmz3a7G!-+O@Z_Dw(lRAS%UYO%ljHq6A%Cfj)-ZRz>VU zJAY9Ze2(`t+(;kNZx#0WEJJP;6hO@$5O~^B+j4_mG%5z*gIn z9*v}O!ZxrxB7_{rb=DGC3m)dKVd^&a&D|Y#yQ*D;Yj=e1)4-BDim5aVy-IcS{Wy0B zT~AC~3Id$L>KpwK#q9p6gHqHQRCA&_H-Y=5`WJZZdEb#S=}n}_x+~(=XH(iK0$7Yj zu0$|cX(=T$K+5s|xJCh!(I#lRKXYFkf+o;`!cFO*)!T3PsNy~MfJYIFvxpUvswVA9 z!DA5z&Wd{AqKN_sE`u~F}?=> zeQmI}Gg5g9yi^5xuSQ%Q43tbS7ABs^KZa=dx#bj_K~Q=%+FsF0@3d{$4JC$fS*(@T z3hW=;z637<%MKSX0RyO>kZ!KlFj;ut`@tdhJA_nMxaPyB#xaTZ5=Fou1~Q}|n9)21 z=e#(h*p<#HPr1kX=Z|ehhorE=!z&k+gu*)NJAp&lNlOo?Q{?7NjQT_I>uA)wDv)%r zepamt?gNynO8}}aLD;{a)1_eul@uHR$rL@j%OGn)j)Pmyu#wmqkVCwo*yQy>r2;1U z_Oo_0cZ^~aP8x(0zPI81f*b&dwbj1OuI9UJTM0#dPzrfK5!HOSiiN!UbXc;Wn#rNN zGH#0m(h5qAt?6B+n5jw-nbgT#fh5a@+u4oou(yjhwpu2k%6V&I349%a76bC9R>*`+ zWSS~mGlc8I@)}r$shN_PXOsWBcL0VgZ+EZu`a<9%uzV`#E~HqX3%OW!pM#xThzhSO ziEV=8%+)B#2H4EWmZq8yK@I1v`?Y$NmK2SufMp8(f*0YWkaOC$;hJIzyvc$~QA|v| zz#Azns|XlLBp1L^^d)>79?Xd_Q@vdDWNH24#q`|ii`m1Ep1F{2O-69XsFvWozjFuB z)w2>>MaHCL&uJ>l3ansvh=hpLCq#D$Ka9KY2p;fiDBh4eE>Kj^>^#bs%;t!RXj+Y` z1h=k>A`9S0h-XG}#bYHNxP-3F!gCAjCl9V&zv83o=ZBZ|?{peUR!X>aJ|8q(iqlt< zYh$e(lljB`sJ#n8BPKcTHaWeK-y>Fa-;{n&B^RKXbS1r)Q`fHXec8O%`8yEtG9%V# z@}Q-q2a2-^0>&Q_gCtDIWo-(`Libz}%~7{fIdQLkmvtNR*l4ZdHU`7Hy;Ux~O$n1< zVh@6}G(!tew-|dp-f17SJH4?6Y}Y$>WVF)dQ~+MF9As%VMY3=JI-%EBc^=>vk|P0yS5QJ@WYZoVN(^es;Jq7j ze}fYSlThVKu7g_;()AiR)W%wAx`%2`>-Kyrj|N7ZVMO%tGf@}8E{Z-G=@oc-`ANlb zAz}_3&%#?+d*tI z0oGgG2*>;A57EPFkvuX1KlEeDcOjxLjRLHc8KiDIh0c|yHoKUW*HB@ALa&?I0BU<( zOlX|G+}vmHd|5ew12e`0qk{0f&;s#R+_7XCTYkD-jdt^I2p}b=DSxi1ad~+2cWH+U z9Q#?*F0z;{#bUNI+zHZ{1a}H#51g0?P3iIgA_~sU=+&YS(XYyt$v3ezbZHPK^$%Ws zDms>Frm~7zb=6IfGz3wN2|KO^HIM0j9M1%HSAejpyc9Aftq#^yP0x5Pf#!qk5@B|t z@jWm_F+MujgsOScj_c_>L;Cc#f=YRjV1zD1T7~dPj@ghm#ILEBqiTs^)P{vbD#g-M z&}d+t5dc)gj>VJv(mBX_GwbbS`*3k;`)XI%pSY75CZe67)|FZN@K!p;vBtYVtE6J^ zzYcC^c$BFL^Gyh?XYGYkyY0PEx7w+$8C%S`QN>p`b)PPp_Q{3gV*F*(tZb;lCW0+2 zH%3Y}xKlJkHl+msU{p`n(}E2-56AdR=JwWg(LAhtP})K=8EP+}uS_&dr+2VbML8&& z{2hfMAF9q<^t7z-=xkz=QrRv{WGz(SW|Tb5mNXd! z9@y0|1{l|BlJ;g!z`)2@ys9u01yeGLVzjeTwez+^lZp!DQBCGBF4)>!#U673jy{rR zZKZbMEw*0xlD&vP?`=WoJ=_8llh9BerRVnIVpn}n8ydliBgjG&Ag;+dq zBuauY7v#k(Ec+u4c@PL!u9R$@7ttV9eHjr1vE8LZjh!bJu8JnkyFq@hz&zy>du(*H zIw^rDswMcO+%kRLgMroAe5Sa8m!fg{!pFfRz@o8i)(LnJoxq(!!zNR5C}0UqiS z07V@R87j`lQWwIMZ7abh<6W~s>HfM(2sFD8xA=Ak)E7m?A)oGW17ixxLRL_(j9F3B zI-u1m-Xy2UiILzS?O7WXnT^(KKMzN;X!p5n>_@q zQla+NLa&CK%BQl1mH{g+Yg61kAtPKn|2LKhS!Ao?)hS}?5g^8McX_qw1`8E1rJIz< z1P53|G0f_guf~qCo^V5sWw?ziL>RW6FxR*t<19O;hie=PtJN4~POifOyBpx42yhaB zxc~tG7mb?|ot>`3h8y$9$H$Uax9ue98|D%9!L@k=K0w;p=#a@ zBX(MLur)H2=H&gSEyY49QPd?jNczk(Az*)$;3o@)2M+rl`pU~u3grP1EO7D;wlXfP z#e=7Nj!a%yCD&^4g9D8oK``#i>jId>zf0ZW6=KJ}*t@Si3Yf0C%dQ7ujBpdfkr=de zr`$(t!CCG@=dp%t$?nsW^bcx)>~4x8q32khp_#|J7cRRh5oD~PEQUapHaBp3k|9|d zey;7{+|+~JdnA0~)^bYCyzSnqL-jM!Ys&t|%y2U+jVFknGz)==iiyN<%^uUH^xZu@ zg+Uk+KrJ5k^wiGDllF}0<+-P)SWMp4dP-)eg+OxZ6w82(EFv@vHF3w7Ck`p+qgEi} zgeL@kRfOjQPsX(0#0Zq*C&U8=*0*yni+8>j?ge7`U?`SYfPs}#k$N|VU8t9bX6qdB zH*vBU7i<3Lh7(1kTF0s(;{dG3(*MuiyEeyhBv-@yDfAbIFY*&?00b`~Z3LG)+804e z%OEH_9y=TzgTa6t3BX_n175!Px4$Q|DyuT9s;|=nQI8p3OCpHrsjkY(JbCg)i3n7A zxj;vj+Xw%Xgd)_=e07pw@}ny4KT2>d+kQ<#;+=iXX=!SxxUT)FF6A$IS6*_k&@xRG z;qak7w8TugO$L)R6uu07JQx7Al;`l@r`fUb2^oSKu?h;MCfN=xd(@I4?b^xNNZ9^v z(Z|+Ne!SDXc@a>#ZQ~yXOrd@jO)UK|S`|*W>a5922}?u{kd|=D1#=gx<>mQ<|8e)1 zH&ETeLa~2A>1UY=#AQ$oBoa>^fty%d-JqCgLGn+mP|!-qpUUcx1`q6t$~jRcF&nm+ zT9Mx1k(m|MdD9HlvT7eqQCEjZEuqxd?HtvN^VypU;nUN1e>wSE{o~1Nv`u^W_LrCM z=Hi`AhL2NhIxV7D?kz-K_hD zu3PGh%}X#{XEc6^uf)%?DQT_?Q%et~3B0wIsti^!6MY3~=F|FivBH6`E>??n%@KIV z5qBU9teL~uEwWb3x*0QD$lM&cEKY`P53-D*E-2NYC3_Vs9X!F<#lOsceDTZccTfc{ z-o88e`LDjY$SHRh3HK-a@^CIFY$&%q$#f;&v{3zwk9Ty`D7CK%3)A1i79T1iAi zRVon6dViCVvMO1!uYC2?G!-mivI1#KYB(4>+(Xs45i>@g^#Z!Fvs~W;LI7}F!_M{? zlGnE`T8f_Nr25~ztzNu237$YS!%46G-4KsMfgQH3Y}x|+39Sn#K8o{EJ=n8M`DWm( z+?#u;Vb6Q`ea}n4m-D|J1{4>f<$B+v6b;Q*=xP940HQ%{?LEg?qYKeiU)!~H_4}^( zsEC3=N@lwXNlt@cQ}sA1Gc?CsZn$Y_z+K$Ol)VcmA>XhfSyYlDsZ6I#TsU%S^7Quc zh6Wg84&0(Em%7A(l%12Y38Q(oR#V|p=vXK(o_m`Gt6yI2I9IC5eG|^gS8bTOd$@#L zQqq^y!UermeyY7Yx^%g9(Mu@n-ynJ;fS))b_;yNhz_h@h9Dt5}O=rI%>&7_=T`LKe z0FR@DYv%~tRMas(6Ff{=XtXiPW4gISzNr&v5eI`s1T|0t7=9fyZlq25@x>`nf0-Z& zOO*h(h@#q4z{5m1)Y7^%I&8WfC1fBu0k}S`P{xjq=yjWhVd$7#)twYe>;~UT*Ugi# z78Mq(%_iW?SuvI^g)?(5vA&Ko<#=DiP2Ms zU(nXl#87o%#W{y4O^RE;wQ~swxfK&>!&#TA^5pfY8eAPuzK{@PC{^R=)$kdNE5<2Q z;|0svkFk)7U6tG6!pDxH56nFyZbi_Js3$IdL=AbioNi3{D}Jt}dvt6utsbr(vfJ$B zUde*$+u~||*Co6B2DPr;c7bFcmq%Kq9iA^2Obv)S$aQK|Sq-HjnFaxkT3`migSDF% zuY0p5Pv-fg0c^ajfpdH88ov?p{QbihZCV_zi!IGe_;TV89X$m|U7XII7X!CHVl zm`-X9_h|$3LcQTK;}gt|CrJFiULqIbbUWYBlZu&7)I!8D8s9y%zZ_#nSuBws&Veu) z1+|Z7pK|9X`f>?kH7?{qPSe!affQ5WHJ6m$dsG4k3+cBV0R|7Qc{XznP&&~eG)(N6 zAcnxgR?m|L--Htwga;8$H3_|@^;Fd%HRIc^>-EJ2j@xRTX|G}bky6M>a9$BciXEX3 z=PhL>ke@3kkZP^iNqlQvoshQQ*sCj{H)2A^pqY1) z#kfdSUEf_%SFqLcwuYWlRB6$arw%qtSgiSSnN%5Mus$kC0l$SVrkl? z6wXw(mXd5zv{57>M|z0)9qDa_L!ei*%ut&6=xi>HV>$#Z5W!9pwNSo66X$+ebr_2B zHld)a>C6)ct)Liq=gcu?%B5hlw0d=h3IBvQN-d3SgV4XUH#LC7wSA;IjqW>~y zv8YIkrYPOR9Xh+&PQpJ@Ct(#=7?3;`WHaOoMI(h^=i9S-yIC${Ks}jmZQ~g&=6MPk zG-hKrydUZzykp(W;Fa%YICSkj)B+jFPHf|AGSyx&53(g zq?D580-_q;jv&9hu`Pkqx)_0@S+G{4Mtm0^*XeC_h>=T@aIoIk_I;T$$lXN3pxFr# z^{S$X;ywmnq!dHU8{{X0SQH`ZbDRgbY(b!bAm93Ih9F`2#VdJI`i&xD3o%%x?XtFv za=pUQr`O_9NSjQ|fW8;A*JtRcd|20KGhX{ClHwQJ>eiQ=s}Lj~`vmF74n3JGoe4wS z)9B%qofIt~q}X<_45hB$EqZzH$!paSGJ}6Q`Pn1`i!tqlPH_uEhRZA(s9>K!oQB^d zxqz5Gs)G=4t_}WPQ>>JIgCGu&)WxbC+8%;02Dua#&r|d>zg%X z28>=u^@Mz3erEel*E;N5;1Tpf%kd?=jy99Js-pRAb4?nwV|OU*=oUlQZ$Hoo;^lUE zE=`9+=$WT<9Y93t+b@`dabAB~Z9l+HpRd-lP`&mKKYZUe3D^2?j#2Ucn-8?G-f0O2 ztKaU$*Qnnw)TkMSO_-opD%64RXyT&Rc`-}4Vz3b{H;k7j37oj7Q8g>?l=IPpSvAqxcvBk4Xq9jl_jU7Z(UNS^Vj~;-9pi!lDdbD7{`B|{9-;;PQ93xyC7c`{P)qgWBYGvH6`&TL)sh1OWC9UkoXJ)Y!tfLzW3zhy zp&4aTbwPbOzukf>(7LZI@DWK>eS7EiA_da60NPh(4qAL-F>l#<7Vv41sa{2dZlr2b zs+f7Tl9XTs9viLEw}T*5>|LszX~-E-1}cUl5YaS5V(#AWeYdTupdOIl`h`yb3TXvRYBIA*> zwf<5&NPRn_0UX_R9%W+}0s$dlKzj+}$@PPW#{z%oJg;&JiawJjMC5eSz?W1IxB&Cr6uvXA!i`iQp+LMO1d zKWPvZ@@&SFr{S3OoGHbE!LGNhPEB=i&N5_X1e)Xcx8;`_dY4^du?VHAs1goSHn2y6 zNvUwPI~kV%AnAlOo%eKmfGIdOGn75U`AHM7mShF5Vu&Yu_ozluKeC=5*Kgm^X>uX? z7UEVf<_Jild&?4?;Cm&jOhCQTv1Zp&F1Us*Q*piYg%b6JTLj&Rsp*fo|44P5ZU*W^ zfifRo%okKj*TcZ&*GyxU-fmc$@yg*3YL_B*T7|euC5CjqR6=G}Y>HkA z2Tf#tFU#$yQaODQ!&)*EGW1HMo|eYInNvlY-P|;B?e#Lq!E**c1r>XG_7PQwV8_>Z zMXl+zuCW(OHR@04x}+edjIaadq3ssAoIUk`3T5VRUbzK~esI(u+7Xeu@kI9|kYDMNRtrCb~%6L3~{t%#;x#1_LcE+C8LX9Ork=L zV(RQT)i+_hG5?_{{Xr{~(qu_l-O7 zbI%&O%B85`lF_h^JTx1maM}c{28ivKm=X;n>FNxBqt@D@kZJkK z$3NxlvU{a&xw&3Y$(hLGS+GL4pXN7+W!vywrC+G8;tK|i$*QX2s1eK&G9jZgls>q( z8ko&Ko;^tDQdIfC-UW3k=7(+#ES`a%IoSW3ybB!n5e-B{%gVSA!43xRWsArh@|v24swC^uE+grBZFyr}+k{(+A&Q%r9@3<>TiA zPh%OVN2X`sMl)AE{*!+a_s9y8LT{m(hpBP?2QMkQKor^d?qSe1?vGy6xIgd*f@`CG zW+M+lTGjTKD97D9K}*V2Zht1tbrSEdD&KXEE(xN^bzRX_7`As6jg18|-hRNpKddj$ zZ&NQm0Tyud$c!Fn2%)|bz)8$GDbtdEEtyn#$1V|ne0GJ^dI|5i{~cVM!h=G|#e0q$ z7>v*rl`N30tKVPW)r-%cv)(ZGg0AA?M!cB!M2_;zlR}(v=M&aN0^vq#G&U;Mqv>*y zmkb65-Nvf80HI6t3;k}wzeMfQo|Ws8ie^MWREHGUKjn@Z0QMgrT%eHH@uq&c!~Nfo zn}Gx5bPSiClay$cxvL1MO2=+L<2mljEww^QBI>!`*#*v5hn$cmDK_{%7wO*(R98nZ zvUfK(q;uDI+)fu<^`XFYE--X;8ZYa&{ssGADB+ZYp77VnPDV}+B@@kj*HT#|T*{f8 z%FKxy6m%@Sl&7)X7&i;cr!Y{^?by`=LQk!qr_a1D6|0rejyHIn$#7b~QY zT-PnLNID&+JM>9D}B|1_Rj1 z7$yz|=jC@QQq(Br8E$BZakl|xW)vp}l!*|4mi31cuZJRaf9j>yL9``)KnmaVP_2y9ziMx$=++L9RJ)1@Zvn?0|BR!gw5s+9%u(t!72C zh*QQ@2%x?Jgn`t)zQvQ<63}3#5pM#g^`b`mc=D@V8sM8tq%acUu-trq@JJtMOF(@% ziIcbWOa0It3;^{Etz)-~z}U$d6_l&kGQwOt`!;MT7S@Mjyi}BHDX^F%MRUTqtb(t81$2HtEze#@x zbrWo7)2KzsrcU$RQ(t1!y#~6+E!t`C(64$-DpL;?h0?T$G=qZS9_-z)*&650dd?=( z*1E;_ssv4){;W`^KXY~ZA`+8bI99#DK{AZtDPjwsxRQ)LM)U zpbG^G$g1har`8ex1XjNYK*GxvnaKk;Pl@h4#`-!ANM5S>s()QT?oych(OG(LMCZkWnF5)y_kU788Ja&J{)PBLy{!g`FDh%!P%cuFWZ=3EI zPf9kS@k-L~_Wb$tKvPV!(?JgRAupw?SxUE_sF1)*%~UGyo2n8a^c(v}61{J#iuFUh z)jo!@*ZcklR#kQ+g-K74CT<5mz4+_N%lhYEe){w5ttllQUh@%R`bB0XcZ3N3g1l4+ z7$laD;h3oI%NU$z%F|Cs$L!)(=qQ|Z_o#$sdcOd}5RZ0bMHt(VS#~^60)9cisGmgv z4v$DXRNV9TmTYn7f}1Vjx1Fa-!p;qBQZ1bybQilL?%$QHtC+u#g%fiDRJNY*zPo;3 z&<|2Z-t=vzQAu|UJPFo}aCH5GX0Clas#E@l6pLo|Qs+HWahV!Jh_Yi6W9F+ja4+e1 zgYckW)T3BLLRzzvdZ~`l*Y|HPU;gsu#m_JQZ~f!zchL7HW>j&^=-!Um1{1Q~2qYyq z_&t;LnvDRRYb3~}Bf4_Pj;#qia5*h3W)JG58+FknIlei7u}cj9ppvR$-{T6Q@w@A7 z64S}aw|EZwZ`@$WtX`3?eJ0$?c{Gx1yBvoPBc_aO29t`ZWLn$AxTVV4mnCc6!70K? z$i7&rhXR0@UM5d!5e%xmNuG;EaiwJ8bw)-XpVAy5W(?7pjdDM}=VaiHFn5WJ4eTnF zIt1ppsTATFg;!kupeBBM3Fm!xGr;!91<+%HR#;Wo?tliNXo13Jb zP#mIDvt|>D`_ud}Z8vnR_Z#}P9d>d=kt6m{s3i4ibep0@<3kWz#AYSv=t2-iE~?{e z+#2uapzY%=&BlxKZoX#UQj~r$!Yu-nw0%(q-X~(xRGIE3lATDsA98jp=T>hq0pJ0j z6g-MhG!>;~s-!cURNMP-OHw*aH@nh}Kf6s9rmB zOc7@Fn96beN+GQ>;E(^4k}$ITk@&O;8-updF8NZrlS871-~GGB^r^RVirOUS5V|Tu zz^?8!BG@^aYj8fZ+ceVq>{?h*xB1HGE@ZDi?9P?4v4-fW>?%I^>(9SDeEF~c`ta!g z9R8ofhyRBDe9-f~Z)RifN6uZ{@Nh349B7jb%IL>f-d>2z^F7aaPDED=7tCp5<1M0N zc;w(5M%x!u%=Pkx0FIR=g5s_&&6BNg=oW??iHv*-K^WA9ub(rjh2+Hj+ZvdXUDhRNd+7sI}=0= z%E4wn?b-@R3waf=+rE!A+&gF@+4}z2b+i(h&4eEo72aF11}WGhvE*7DCJ<5KF2cZo zZJB*3o7c8ZplxCvJC2r_%qayu)&hwXn5Q!$Hm_Uafbg?p*S|5zApS}f8hga@zHKMb zejUwD?Wk~KqI7h8D=m5ad|6NDi7>%$T7XP|HXc*wqzzhX)N|KF?G2L98Or#*48A~P zg{18X7u(v2HppK&Q-u1iaR?aFSLkxv#=`8v#ESkB@yUfCUf+JlRLaRVL9HIm8cU$J zoQXR!k5p?$d36JHyjSP_Ra3C{RoyUi_stue`nuSmBOOCsPN8SK>l4pC;}2Hnrg^-% zIO?V+zWpw;su_>bS5yF?oVr@7n?pNP-t%aIaT26Lmm1?x%I~iasE#}kQu~?!(9qUx zD#ybO8Aw8?hfJgd-Iw9Qf|sp4*&dnfP5?SaE)55BtsNn&CyUD^>e+RXiMe#s2#|SX zn}*pVT#TRxF2BCdr6vynzlssxKe$UL6uREsgXAssCK&*aODTBlBFK4zo7{xT7WFlt z6zxN^pYs~}7Sq^Wlv*^Netf1}4cl9^m}9zDiq34_>fp(@ghSJdGP*Fjs`_8XUU(~Z zkWonv2`iA7QJZ(p8ZSOhN}(dD>B;n-7bx8|?kg}ZbFi2Mqwu+wEVhLct5VapR`sNu zOD9T7Y5f;iF86Ou%L7#2%r}7QA81hW22|)M02w7BZx&ZK^~LqVCnd*RWBz^W zIHV+@;G7%t>Hgr0uyNuzq^dA<&(`1x4Mz4@m4o9i*h6SfOC~$ar#U* zo({>}5|(X9cbC|yde~G62BpH6y?o7Su__HOF6sR7I?)f4%Tzx57#XY5*)FDhLA{VW zgs}1Kv9`p=`R`+8ms@V>H~<=4=>i{R@nihM_M!#%<`mk#T>6Qm_wi-DYZTo2LR%w~ z=x}7!U#8c0F&sGyqU|{I?w!iD=xN(=kkrV$$ennD(9)P(|AvN^ZOm#=Li^0L&AhAr zfvX7kB#Ym5=5s+vG2jKmB+kchgr9dn%Aoo97D(PhNa=?$gHsA&T0(6+2Y^wV(=)in zS7^vq&(G&KaJ3WJ;@@#vLl`gRFKG#9m&A_tE8qw5fD9j=w^1k%WfKw?m2L})wBFPD zrwp~f&5%@|!(AC4?c?}F)z5I+Tef=Kc z8%(61pL0{GoxdyV!PRk8#r&M&VU3JbXfJTH{J111I2cDUJ&DbfA3Lk+ggCXM{O1WO ztDV7hx5GgKIfG1w)RpYVgf)~2bh_BU8tZGTkF*i?$ZT$;<=emp!Q*mG?AXXp`5~bp2ag>ef*$vOKLyTNb zpzEogpbpgudIAMacO>IOtc95V3#rcu57seWULRUPSNYTr|<3U0O|z?H!vo}<$9oqV8ZS0mDR5Thd_MjYj#P)u@{{e!jLt| zB`Bj7mIK=koyAPkdS!Sp!qagUGwrC|%U`5T9Z(jCUq}B-)eIt{Y10hi&#@WAGs?yE z%^-MQNQVlIOw94s`uuFgQ*R7C@Yv7;t*=>f28z}LFJ{e0e6b*6B?F>UJv25!TkY+$ zTAEf7Zqf*fQ>Q4S3qL-H(>m?!Ede5ia9C9#~~P*eHLXFVM}ytwobmR$QXW4Q5#gUFq2}ry

><}xubG1 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

9kWik_5` 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�>~3$v&wu5JIvT;SO4H+(z!>^0w4 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⪼7-?oJbZ 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

;=TJYlchKS3&;54{JKeI5tpUjU?4;Fru_ZO@Z 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 Yh}MsH2KC0_Ordj9L~qbH^FiYO05b=&Z~y=R literal 0 HcmV?d00001 diff --git a/src/sparsehash-1.6/src/config.h b/src/sparsehash-1.6/src/config.h new file mode 100644 index 0000000..4183665 --- /dev/null +++ b/src/sparsehash-1.6/src/config.h @@ -0,0 +1,132 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Namespace for Google classes */ +#define GOOGLE_NAMESPACE ::google + +/* the location of the header defining hash functions */ +#define HASH_FUN_H + +/* the location of or */ +#define HASH_MAP_H + +/* the namespace of the hash<> function */ +#define HASH_NAMESPACE std::tr1 + +/* the location of or */ +#define HASH_SET_H + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GOOGLE_MALLOC_EXTENSION_H */ + +/* define if the compiler has hash_map */ +#define HAVE_HASH_MAP 1 + +/* define if the compiler has hash_set */ +#define HAVE_HASH_SET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* define if the compiler implements namespaces */ +#define HAVE_NAMESPACES 1 + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UTSNAME_H 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define HAVE_UINT16_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* define if the compiler supports unordered_{map,set} */ +#define HAVE_UNORDERED_MAP 1 + +/* Define to 1 if the system has the type `u_int16_t'. */ +#define HAVE_U_INT16_T 1 + +/* Define to 1 if the system has the type `__uint16'. */ +/* #undef HAVE___UINT16 */ + +/* Name of package */ +#define PACKAGE "sparsehash" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "opensource@google.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "sparsehash" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "sparsehash 1.6" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "sparsehash" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.6" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The system-provided hash function including the namespace. */ +#define SPARSEHASH_HASH HASH_NAMESPACE::hash + +/* The system-provided hash function, in namespace HASH_NAMESPACE. */ +#define SPARSEHASH_HASH_NO_NAMESPACE hash + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* the namespace where STL code like vector<> is defined */ +#define STL_NAMESPACE std + +/* Version number of package */ +#define VERSION "1.6" + +/* Stops putting the code inside the Google namespace */ +#define _END_GOOGLE_NAMESPACE_ } + +/* Puts following code inside the Google namespace */ +#define _START_GOOGLE_NAMESPACE_ namespace google { diff --git a/src/sparsehash-1.6/src/config.h.in b/src/sparsehash-1.6/src/config.h.in new file mode 100644 index 0000000..bef1650 --- /dev/null +++ b/src/sparsehash-1.6/src/config.h.in @@ -0,0 +1,131 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Namespace for Google classes */ +#undef GOOGLE_NAMESPACE + +/* the location of the header defining hash functions */ +#undef HASH_FUN_H + +/* the location of or */ +#undef HASH_MAP_H + +/* the namespace of the hash<> function */ +#undef HASH_NAMESPACE + +/* the location of or */ +#undef HASH_SET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GOOGLE_MALLOC_EXTENSION_H + +/* define if the compiler has hash_map */ +#undef HAVE_HASH_MAP + +/* define if the compiler has hash_set */ +#undef HAVE_HASH_SET + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if the system has the type `long long'. */ +#undef HAVE_LONG_LONG + +/* Define to 1 if you have the `memcpy' function. */ +#undef HAVE_MEMCPY + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* define if the compiler implements namespaces */ +#undef HAVE_NAMESPACES + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UTSNAME_H + +/* Define to 1 if the system has the type `uint16_t'. */ +#undef HAVE_UINT16_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* define if the compiler supports unordered_{map,set} */ +#undef HAVE_UNORDERED_MAP + +/* Define to 1 if the system has the type `u_int16_t'. */ +#undef HAVE_U_INT16_T + +/* Define to 1 if the system has the type `__uint16'. */ +#undef HAVE___UINT16 + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* The system-provided hash function including the namespace. */ +#undef SPARSEHASH_HASH + +/* The system-provided hash function, in namespace HASH_NAMESPACE. */ +#undef SPARSEHASH_HASH_NO_NAMESPACE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* the namespace where STL code like vector<> is defined */ +#undef STL_NAMESPACE + +/* Version number of package */ +#undef VERSION + +/* Stops putting the code inside the Google namespace */ +#undef _END_GOOGLE_NAMESPACE_ + +/* Puts following code inside the Google namespace */ +#undef _START_GOOGLE_NAMESPACE_ diff --git a/src/sparsehash-1.6/src/config.h.include b/src/sparsehash-1.6/src/config.h.include new file mode 100644 index 0000000..5b0e3a2 --- /dev/null +++ b/src/sparsehash-1.6/src/config.h.include @@ -0,0 +1,23 @@ +/*** + *** These are #defines that autoheader puts in config.h.in that we + *** want to show up in sparseconfig.h, the minimal config.h file + *** #included by all our .h files. The reason we don't take + *** everything that autoheader emits is that we have to include a + *** config.h in installed header files, and we want to minimize the + *** number of #defines we make so as to not pollute the namespace. + ***/ +GOOGLE_NAMESPACE +HASH_NAMESPACE +HASH_FUN_H +SPARSEHASH_HASH +HAVE_UINT16_T +HAVE_U_INT16_T +HAVE___UINT16 +HAVE_LONG_LONG +HAVE_SYS_TYPES_H +HAVE_STDINT_H +HAVE_INTTYPES_H +HAVE_MEMCPY +STL_NAMESPACE +_END_GOOGLE_NAMESPACE_ +_START_GOOGLE_NAMESPACE_ diff --git a/src/sparsehash-1.6/src/google/dense_hash_map b/src/sparsehash-1.6/src/google/dense_hash_map new file mode 100644 index 0000000..888643a --- /dev/null +++ b/src/sparsehash-1.6/src/google/dense_hash_map @@ -0,0 +1,319 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ---- +// Author: Craig Silverstein +// +// This is just a very thin wrapper over densehashtable.h, just +// like sgi stl's stl_hash_map is a very thin wrapper over +// stl_hashtable. The major thing we define is operator[], because +// we have a concept of a data_type which stl_hashtable doesn't +// (it only has a key and a value). +// +// NOTE: this is exactly like sparse_hash_map.h, with the word +// "sparse" replaced by "dense", except for the addition of +// set_empty_key(). +// +// YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION. +// +// Otherwise your program will die in mysterious ways. +// +// In other respects, we adhere mostly to the STL semantics for +// hash-map. One important exception is that insert() may invalidate +// iterators entirely -- STL semantics are that insert() may reorder +// iterators, but they all still refer to something valid in the +// hashtable. Not so for us. Likewise, insert() may invalidate +// pointers into the hashtable. (Whether insert invalidates iterators +// and pointers depends on whether it results in a hashtable resize). +// On the plus side, delete() doesn't invalidate iterators or pointers +// at all, or even change the ordering of elements. +// +// Here are a few "power user" tips: +// +// 1) set_deleted_key(): +// If you want to use erase() you *must* call set_deleted_key(), +// in addition to set_empty_key(), after construction. +// The deleted and empty keys must differ. +// +// 2) resize(0): +// When an item is deleted, its memory isn't freed right +// away. This allows you to iterate over a hashtable, +// and call erase(), without invalidating the iterator. +// To force the memory to be freed, call resize(0). +// For tr1 compatibility, this can also be called as rehash(0). +// +// 3) min_load_factor(0.0) +// Setting the minimum load factor to 0.0 guarantees that +// the hash table will never shrink. +// +// Roughly speaking: +// (1) dense_hash_map: fastest, uses the most memory unless entries are small +// (2) sparse_hash_map: slowest, uses the least memory +// (3) hash_map / unordered_map (STL): in the middle +// +// Typically I use sparse_hash_map when I care about space and/or when +// I need to save the hashtable on disk. I use hash_map otherwise. I +// don't personally use dense_hash_set ever; some people use it for +// small sets with lots of lookups. +// +// - dense_hash_map has, typically, about 78% memory overhead (if your +// data takes up X bytes, the hash_map uses .78X more bytes in overhead). +// - sparse_hash_map has about 4 bits overhead per entry. +// - sparse_hash_map can be 3-7 times slower than the others for lookup and, +// especially, inserts. See time_hash_map.cc for details. +// +// See /usr/(local/)?doc/sparsehash-*/dense_hash_map.html +// for information about how to use this class. + +#ifndef _DENSE_HASH_MAP_H_ +#define _DENSE_HASH_MAP_H_ + +#include +#include // for FILE * in read()/write() +#include // for the default template args +#include // for equal_to +#include // for alloc<> +#include // for pair<> +#include HASH_FUN_H // defined in config.h +#include + + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +template , // defined in sparseconfig.h + class EqualKey = STL_NAMESPACE::equal_to, + class Alloc = STL_NAMESPACE::allocator > +class dense_hash_map { + private: + // Apparently select1st is not stl-standard, so we define our own + struct SelectKey { + const Key& operator()(const pair& p) const { + return p.first; + } + }; + struct SetKey { + void operator()(pair* value, const Key& new_key) const { + *const_cast(&value->first) = new_key; + // It would be nice to clear the rest of value here as well, in + // case it's taking up a lot of memory. We do this by clearing + // the value. This assumes T has a zero-arg constructor! + value->second = T(); + } + }; + + // The actual data + typedef dense_hashtable, Key, HashFcn, + SelectKey, SetKey, EqualKey, Alloc> ht; + ht rep; + + public: + typedef typename ht::key_type key_type; + typedef T data_type; + typedef T mapped_type; + typedef typename ht::value_type value_type; + typedef typename ht::hasher hasher; + typedef typename ht::key_equal key_equal; + typedef Alloc allocator_type; + + typedef typename ht::size_type size_type; + typedef typename ht::difference_type difference_type; + typedef typename ht::pointer pointer; + typedef typename ht::const_pointer const_pointer; + typedef typename ht::reference reference; + typedef typename ht::const_reference const_reference; + + typedef typename ht::iterator iterator; + typedef typename ht::const_iterator const_iterator; + typedef typename ht::local_iterator local_iterator; + typedef typename ht::const_local_iterator const_local_iterator; + + // Iterator functions + iterator begin() { return rep.begin(); } + iterator end() { return rep.end(); } + const_iterator begin() const { return rep.begin(); } + const_iterator end() const { return rep.end(); } + + + // These come from tr1's unordered_map. For us, a bucket has 0 or 1 elements. + local_iterator begin(size_type i) { return rep.begin(i); } + local_iterator end(size_type i) { return rep.end(i); } + const_local_iterator begin(size_type i) const { return rep.begin(i); } + const_local_iterator end(size_type i) const { return rep.end(i); } + + // Accessor functions + // TODO(csilvers): implement Alloc get_allocator() const; + hasher hash_funct() const { return rep.hash_funct(); } + hasher hash_function() const { return hash_funct(); } + key_equal key_eq() const { return rep.key_eq(); } + + + // Constructors + explicit dense_hash_map(size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { } + + template + dense_hash_map(InputIterator f, InputIterator l, + size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { + rep.insert(f, l); + } + // We use the default copy constructor + // We use the default operator=() + // We use the default destructor + + void clear() { rep.clear(); } + // This clears the hash map without resizing it down to the minimum + // bucket count, but rather keeps the number of buckets constant + void clear_no_resize() { rep.clear_no_resize(); } + void swap(dense_hash_map& hs) { rep.swap(hs.rep); } + + + // Functions concerning size + size_type size() const { return rep.size(); } + size_type max_size() const { return rep.max_size(); } + bool empty() const { return rep.empty(); } + size_type bucket_count() const { return rep.bucket_count(); } + size_type max_bucket_count() const { return rep.max_bucket_count(); } + + // These are tr1 methods. bucket() is the bucket the key is or would be in. + size_type bucket_size(size_type i) const { return rep.bucket_size(i); } + size_type bucket(const key_type& key) const { return rep.bucket(key); } + float load_factor() const { + return size() * 1.0f / bucket_count(); + } + float max_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return grow; + } + void max_load_factor(float new_grow) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(shrink, new_grow); + } + // These aren't tr1 methods but perhaps ought to be. + float min_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return shrink; + } + void min_load_factor(float new_shrink) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(new_shrink, grow); + } + // Deprecated; use min_load_factor() or max_load_factor() instead. + void set_resizing_parameters(float shrink, float grow) { + return rep.set_resizing_parameters(shrink, grow); + } + + void resize(size_type hint) { rep.resize(hint); } + void rehash(size_type hint) { resize(hint); } // the tr1 name + + // Lookup routines + iterator find(const key_type& key) { return rep.find(key); } + const_iterator find(const key_type& key) const { return rep.find(key); } + + data_type& operator[](const key_type& key) { // This is our value-add! + iterator it = find(key); + if (it != end()) { + return it->second; + } else { + return insert(value_type(key, data_type())).first->second; + } + } + + size_type count(const key_type& key) const { return rep.count(key); } + + pair equal_range(const key_type& key) { + return rep.equal_range(key); + } + pair equal_range(const key_type& key) const { + return rep.equal_range(key); + } + + // Insertion routines + pair insert(const value_type& obj) { return rep.insert(obj); } + template + void insert(InputIterator f, InputIterator l) { rep.insert(f, l); } + void insert(const_iterator f, const_iterator l) { rep.insert(f, l); } + // required for std::insert_iterator; the passed-in iterator is ignored + iterator insert(iterator, const value_type& obj) { return insert(obj).first; } + + + // Deletion and empty routines + // THESE ARE NON-STANDARD! I make you specify an "impossible" key + // value to identify deleted and empty buckets. You can change the + // deleted key as time goes on, or get rid of it entirely to be insert-only. + void set_empty_key(const key_type& key) { // YOU MUST CALL THIS! + rep.set_empty_key(value_type(key, data_type())); // rep wants a value + } + key_type empty_key() const { + return rep.empty_key().first; // rep returns a value + } + + void set_deleted_key(const key_type& key) { rep.set_deleted_key(key); } + void clear_deleted_key() { rep.clear_deleted_key(); } + key_type deleted_key() const { return rep.deleted_key(); } + + // These are standard + size_type erase(const key_type& key) { return rep.erase(key); } + void erase(iterator it) { rep.erase(it); } + void erase(iterator f, iterator l) { rep.erase(f, l); } + + + // Comparison + bool operator==(const dense_hash_map& hs) const { return rep == hs.rep; } + bool operator!=(const dense_hash_map& hs) const { return rep != hs.rep; } + + + // I/O -- this is an add-on for writing metainformation to disk + bool write_metadata(FILE *fp) { return rep.write_metadata(fp); } + bool read_metadata(FILE *fp) { return rep.read_metadata(fp); } + bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); } + bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); } +}; + +// We need a global swap as well +template +inline void swap(dense_hash_map& hm1, + dense_hash_map& hm2) { + hm1.swap(hm2); +} + +_END_GOOGLE_NAMESPACE_ + +#endif /* _DENSE_HASH_MAP_H_ */ diff --git a/src/sparsehash-1.6/src/google/dense_hash_set b/src/sparsehash-1.6/src/google/dense_hash_set new file mode 100644 index 0000000..75be3e3 --- /dev/null +++ b/src/sparsehash-1.6/src/google/dense_hash_set @@ -0,0 +1,296 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// This is just a very thin wrapper over densehashtable.h, just +// like sgi stl's stl_hash_set is a very thin wrapper over +// stl_hashtable. The major thing we define is operator[], because +// we have a concept of a data_type which stl_hashtable doesn't +// (it only has a key and a value). +// +// This is more different from dense_hash_map than you might think, +// because all iterators for sets are const (you obviously can't +// change the key, and for sets there is no value). +// +// NOTE: this is exactly like sparse_hash_set.h, with the word +// "sparse" replaced by "dense", except for the addition of +// set_empty_key(). +// +// YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION. +// +// Otherwise your program will die in mysterious ways. +// +// In other respects, we adhere mostly to the STL semantics for +// hash-map. One important exception is that insert() may invalidate +// iterators entirely -- STL semantics are that insert() may reorder +// iterators, but they all still refer to something valid in the +// hashtable. Not so for us. Likewise, insert() may invalidate +// pointers into the hashtable. (Whether insert invalidates iterators +// and pointers depends on whether it results in a hashtable resize). +// On the plus side, delete() doesn't invalidate iterators or pointers +// at all, or even change the ordering of elements. +// +// Here are a few "power user" tips: +// +// 1) set_deleted_key(): +// If you want to use erase() you must call set_deleted_key(), +// in addition to set_empty_key(), after construction. +// The deleted and empty keys must differ. +// +// 2) resize(0): +// When an item is deleted, its memory isn't freed right +// away. This allows you to iterate over a hashtable, +// and call erase(), without invalidating the iterator. +// To force the memory to be freed, call resize(0). +// For tr1 compatibility, this can also be called as rehash(0). +// +// 3) min_load_factor(0.0) +// Setting the minimum load factor to 0.0 guarantees that +// the hash table will never shrink. +// +// Roughly speaking: +// (1) dense_hash_set: fastest, uses the most memory unless entries are small +// (2) sparse_hash_set: slowest, uses the least memory +// (3) hash_set / unordered_set (STL): in the middle +// +// Typically I use sparse_hash_set when I care about space and/or when +// I need to save the hashtable on disk. I use hash_set otherwise. I +// don't personally use dense_hash_set ever; some people use it for +// small sets with lots of lookups. +// +// - dense_hash_set has, typically, about 78% memory overhead (if your +// data takes up X bytes, the hash_set uses .78X more bytes in overhead). +// - sparse_hash_set has about 4 bits overhead per entry. +// - sparse_hash_set can be 3-7 times slower than the others for lookup and, +// especially, inserts. See time_hash_map.cc for details. +// +// See /usr/(local/)?doc/sparsehash-*/dense_hash_set.html +// for information about how to use this class. + +#ifndef _DENSE_HASH_SET_H_ +#define _DENSE_HASH_SET_H_ + +#include +#include // for FILE * in read()/write() +#include // for the default template args +#include // for equal_to +#include // for alloc<> +#include // for pair<> +#include HASH_FUN_H // defined in config.h +#include + + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +template , // defined in sparseconfig.h + class EqualKey = STL_NAMESPACE::equal_to, + class Alloc = STL_NAMESPACE::allocator > +class dense_hash_set { + private: + // Apparently identity is not stl-standard, so we define our own + struct Identity { + Value& operator()(Value& v) const { return v; } + const Value& operator()(const Value& v) const { return v; } + }; + struct SetKey { + void operator()(Value* value, const Value& new_key) const { + *value = new_key; + } + }; + + // The actual data + typedef dense_hashtable ht; + ht rep; + + public: + typedef typename ht::key_type key_type; + typedef typename ht::value_type value_type; + typedef typename ht::hasher hasher; + typedef typename ht::key_equal key_equal; + typedef Alloc allocator_type; + + typedef typename ht::size_type size_type; + typedef typename ht::difference_type difference_type; + typedef typename ht::const_pointer pointer; + typedef typename ht::const_pointer const_pointer; + typedef typename ht::const_reference reference; + typedef typename ht::const_reference const_reference; + + typedef typename ht::const_iterator iterator; + typedef typename ht::const_iterator const_iterator; + typedef typename ht::const_local_iterator local_iterator; + typedef typename ht::const_local_iterator const_local_iterator; + + + // Iterator functions -- recall all iterators are const + iterator begin() const { return rep.begin(); } + iterator end() const { return rep.end(); } + + // These come from tr1's unordered_set. For us, a bucket has 0 or 1 elements. + local_iterator begin(size_type i) const { return rep.begin(i); } + local_iterator end(size_type i) const { return rep.end(i); } + + + // Accessor functions + hasher hash_funct() const { return rep.hash_funct(); } + key_equal key_eq() const { return rep.key_eq(); } + + + // Constructors + explicit dense_hash_set(size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { } + + template + dense_hash_set(InputIterator f, InputIterator l, + size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { + rep.insert(f, l); + } + // We use the default copy constructor + // We use the default operator=() + // We use the default destructor + + void clear() { rep.clear(); } + // This clears the hash set without resizing it down to the minimum + // bucket count, but rather keeps the number of buckets constant + void clear_no_resize() { rep.clear_no_resize(); } + void swap(dense_hash_set& hs) { rep.swap(hs.rep); } + + + // Functions concerning size + size_type size() const { return rep.size(); } + size_type max_size() const { return rep.max_size(); } + bool empty() const { return rep.empty(); } + size_type bucket_count() const { return rep.bucket_count(); } + size_type max_bucket_count() const { return rep.max_bucket_count(); } + + // These are tr1 methods. bucket() is the bucket the key is or would be in. + size_type bucket_size(size_type i) const { return rep.bucket_size(i); } + size_type bucket(const key_type& key) const { return rep.bucket(key); } + float load_factor() const { + return size() * 1.0f / bucket_count(); + } + float max_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return grow; + } + void max_load_factor(float new_grow) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(shrink, new_grow); + } + // These aren't tr1 methods but perhaps ought to be. + float min_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return shrink; + } + void min_load_factor(float new_shrink) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(new_shrink, grow); + } + // Deprecated; use min_load_factor() or max_load_factor() instead. + void set_resizing_parameters(float shrink, float grow) { + return rep.set_resizing_parameters(shrink, grow); + } + + void resize(size_type hint) { rep.resize(hint); } + void rehash(size_type hint) { resize(hint); } // the tr1 name + + // Lookup routines + iterator find(const key_type& key) const { return rep.find(key); } + + size_type count(const key_type& key) const { return rep.count(key); } + + pair equal_range(const key_type& key) const { + return rep.equal_range(key); + } + + // Insertion routines + pair insert(const value_type& obj) { + pair p = rep.insert(obj); + return pair(p.first, p.second); // const to non-const + } + template + void insert(InputIterator f, InputIterator l) { rep.insert(f, l); } + void insert(const_iterator f, const_iterator l) { rep.insert(f, l); } + // required for std::insert_iterator; the passed-in iterator is ignored + iterator insert(iterator, const value_type& obj) { return insert(obj).first; } + + + // Deletion and empty routines + // THESE ARE NON-STANDARD! I make you specify an "impossible" key + // value to identify deleted and empty buckets. You can change the + // deleted key as time goes on, or get rid of it entirely to be insert-only. + void set_empty_key(const key_type& key) { rep.set_empty_key(key); } + key_type empty_key() const { return rep.empty_key(); } + + void set_deleted_key(const key_type& key) { rep.set_deleted_key(key); } + void clear_deleted_key() { rep.clear_deleted_key(); } + key_type deleted_key() const { return rep.deleted_key(); } + + // These are standard + size_type erase(const key_type& key) { return rep.erase(key); } + void erase(iterator it) { rep.erase(it); } + void erase(iterator f, iterator l) { rep.erase(f, l); } + + + // Comparison + bool operator==(const dense_hash_set& hs) const { return rep == hs.rep; } + bool operator!=(const dense_hash_set& hs) const { return rep != hs.rep; } + + + // I/O -- this is an add-on for writing metainformation to disk + bool write_metadata(FILE *fp) { return rep.write_metadata(fp); } + bool read_metadata(FILE *fp) { return rep.read_metadata(fp); } + bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); } + bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); } +}; + +template +inline void swap(dense_hash_set& hs1, + dense_hash_set& hs2) { + hs1.swap(hs2); +} + +_END_GOOGLE_NAMESPACE_ + +#endif /* _DENSE_HASH_SET_H_ */ diff --git a/src/sparsehash-1.6/src/google/sparse_hash_map b/src/sparsehash-1.6/src/google/sparse_hash_map new file mode 100644 index 0000000..82ab2bd --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparse_hash_map @@ -0,0 +1,301 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// This is just a very thin wrapper over sparsehashtable.h, just +// like sgi stl's stl_hash_map is a very thin wrapper over +// stl_hashtable. The major thing we define is operator[], because +// we have a concept of a data_type which stl_hashtable doesn't +// (it only has a key and a value). +// +// We adhere mostly to the STL semantics for hash-map. One important +// exception is that insert() may invalidate iterators entirely -- STL +// semantics are that insert() may reorder iterators, but they all +// still refer to something valid in the hashtable. Not so for us. +// Likewise, insert() may invalidate pointers into the hashtable. +// (Whether insert invalidates iterators and pointers depends on +// whether it results in a hashtable resize). On the plus side, +// delete() doesn't invalidate iterators or pointers at all, or even +// change the ordering of elements. +// +// Here are a few "power user" tips: +// +// 1) set_deleted_key(): +// Unlike STL's hash_map, if you want to use erase() you +// *must* call set_deleted_key() after construction. +// +// 2) resize(0): +// When an item is deleted, its memory isn't freed right +// away. This is what allows you to iterate over a hashtable +// and call erase() without invalidating the iterator. +// To force the memory to be freed, call resize(0). +// For tr1 compatibility, this can also be called as rehash(0). +// +// 3) min_load_factor(0.0) +// Setting the minimum load factor to 0.0 guarantees that +// the hash table will never shrink. +// +// Roughly speaking: +// (1) dense_hash_map: fastest, uses the most memory unless entries are small +// (2) sparse_hash_map: slowest, uses the least memory +// (3) hash_map / unordered_map (STL): in the middle +// +// Typically I use sparse_hash_map when I care about space and/or when +// I need to save the hashtable on disk. I use hash_map otherwise. I +// don't personally use dense_hash_map ever; some people use it for +// small maps with lots of lookups. +// +// - dense_hash_map has, typically, about 78% memory overhead (if your +// data takes up X bytes, the hash_map uses .78X more bytes in overhead). +// - sparse_hash_map has about 4 bits overhead per entry. +// - sparse_hash_map can be 3-7 times slower than the others for lookup and, +// especially, inserts. See time_hash_map.cc for details. +// +// See /usr/(local/)?doc/sparsehash-*/sparse_hash_map.html +// for information about how to use this class. + +#ifndef _SPARSE_HASH_MAP_H_ +#define _SPARSE_HASH_MAP_H_ + +#include +#include // for FILE * in read()/write() +#include // for the default template args +#include // for equal_to +#include // for alloc<> +#include // for pair<> +#include HASH_FUN_H // defined in config.h +#include + + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +template , // defined in sparseconfig.h + class EqualKey = STL_NAMESPACE::equal_to, + class Alloc = STL_NAMESPACE::allocator > +class sparse_hash_map { + private: + // Apparently select1st is not stl-standard, so we define our own + struct SelectKey { + const Key& operator()(const pair& p) const { + return p.first; + } + }; + struct SetKey { + void operator()(pair* value, const Key& new_key) const { + *const_cast(&value->first) = new_key; + // It would be nice to clear the rest of value here as well, in + // case it's taking up a lot of memory. We do this by clearing + // the value. This assumes T has a zero-arg constructor! + value->second = T(); + } + }; + + // The actual data + typedef sparse_hashtable, Key, HashFcn, + SelectKey, SetKey, EqualKey, Alloc> ht; + ht rep; + + public: + typedef typename ht::key_type key_type; + typedef T data_type; + typedef T mapped_type; + typedef typename ht::value_type value_type; + typedef typename ht::hasher hasher; + typedef typename ht::key_equal key_equal; + typedef Alloc allocator_type; + + typedef typename ht::size_type size_type; + typedef typename ht::difference_type difference_type; + typedef typename ht::pointer pointer; + typedef typename ht::const_pointer const_pointer; + typedef typename ht::reference reference; + typedef typename ht::const_reference const_reference; + + typedef typename ht::iterator iterator; + typedef typename ht::const_iterator const_iterator; + typedef typename ht::local_iterator local_iterator; + typedef typename ht::const_local_iterator const_local_iterator; + + // Iterator functions + iterator begin() { return rep.begin(); } + iterator end() { return rep.end(); } + const_iterator begin() const { return rep.begin(); } + const_iterator end() const { return rep.end(); } + + // These come from tr1's unordered_map. For us, a bucket has 0 or 1 elements. + local_iterator begin(size_type i) { return rep.begin(i); } + local_iterator end(size_type i) { return rep.end(i); } + const_local_iterator begin(size_type i) const { return rep.begin(i); } + const_local_iterator end(size_type i) const { return rep.end(i); } + + // Accessor functions + // TODO(csilvers): implement Alloc get_allocator() const; + hasher hash_funct() const { return rep.hash_funct(); } + hasher hash_function() const { return hash_funct(); } + key_equal key_eq() const { return rep.key_eq(); } + + + // Constructors + explicit sparse_hash_map(size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { } + + template + sparse_hash_map(InputIterator f, InputIterator l, + size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { + rep.insert(f, l); + } + // We use the default copy constructor + // We use the default operator=() + // We use the default destructor + + void clear() { rep.clear(); } + void swap(sparse_hash_map& hs) { rep.swap(hs.rep); } + + + // Functions concerning size + size_type size() const { return rep.size(); } + size_type max_size() const { return rep.max_size(); } + bool empty() const { return rep.empty(); } + size_type bucket_count() const { return rep.bucket_count(); } + size_type max_bucket_count() const { return rep.max_bucket_count(); } + + // These are tr1 methods. bucket() is the bucket the key is or would be in. + size_type bucket_size(size_type i) const { return rep.bucket_size(i); } + size_type bucket(const key_type& key) const { return rep.bucket(key); } + float load_factor() const { + return size() * 1.0f / bucket_count(); + } + float max_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return grow; + } + void max_load_factor(float new_grow) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(shrink, new_grow); + } + // These aren't tr1 methods but perhaps ought to be. + float min_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return shrink; + } + void min_load_factor(float new_shrink) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(new_shrink, grow); + } + // Deprecated; use min_load_factor() or max_load_factor() instead. + void set_resizing_parameters(float shrink, float grow) { + return rep.set_resizing_parameters(shrink, grow); + } + + void resize(size_type hint) { rep.resize(hint); } + void rehash(size_type hint) { resize(hint); } // the tr1 name + + // Lookup routines + iterator find(const key_type& key) { return rep.find(key); } + const_iterator find(const key_type& key) const { return rep.find(key); } + + data_type& operator[](const key_type& key) { // This is our value-add! + iterator it = find(key); + if (it != end()) { + return it->second; + } else { + return insert(value_type(key, data_type())).first->second; + } + } + + size_type count(const key_type& key) const { return rep.count(key); } + + pair equal_range(const key_type& key) { + return rep.equal_range(key); + } + pair equal_range(const key_type& key) const { + return rep.equal_range(key); + } + + // Insertion routines + pair insert(const value_type& obj) { return rep.insert(obj); } + template + void insert(InputIterator f, InputIterator l) { rep.insert(f, l); } + void insert(const_iterator f, const_iterator l) { rep.insert(f, l); } + // required for std::insert_iterator; the passed-in iterator is ignored + iterator insert(iterator, const value_type& obj) { return insert(obj).first; } + + + // Deletion routines + // THESE ARE NON-STANDARD! I make you specify an "impossible" key + // value to identify deleted buckets. You can change the key as + // time goes on, or get rid of it entirely to be insert-only. + void set_deleted_key(const key_type& key) { + rep.set_deleted_key(key); + } + void clear_deleted_key() { rep.clear_deleted_key(); } + key_type deleted_key() const { return rep.deleted_key(); } + + // These are standard + size_type erase(const key_type& key) { return rep.erase(key); } + void erase(iterator it) { rep.erase(it); } + void erase(iterator f, iterator l) { rep.erase(f, l); } + + + // Comparison + bool operator==(const sparse_hash_map& hs) const { return rep == hs.rep; } + bool operator!=(const sparse_hash_map& hs) const { return rep != hs.rep; } + + + // I/O -- this is an add-on for writing metainformation to disk + bool write_metadata(FILE *fp) { return rep.write_metadata(fp); } + bool read_metadata(FILE *fp) { return rep.read_metadata(fp); } + bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); } + bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); } +}; + +// We need a global swap as well +template +inline void swap(sparse_hash_map& hm1, + sparse_hash_map& hm2) { + hm1.swap(hm2); +} + +_END_GOOGLE_NAMESPACE_ + +#endif /* _SPARSE_HASH_MAP_H_ */ diff --git a/src/sparsehash-1.6/src/google/sparse_hash_set b/src/sparsehash-1.6/src/google/sparse_hash_set new file mode 100644 index 0000000..17b4ad5 --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparse_hash_set @@ -0,0 +1,282 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// This is just a very thin wrapper over sparsehashtable.h, just +// like sgi stl's stl_hash_set is a very thin wrapper over +// stl_hashtable. The major thing we define is operator[], because +// we have a concept of a data_type which stl_hashtable doesn't +// (it only has a key and a value). +// +// This is more different from sparse_hash_map than you might think, +// because all iterators for sets are const (you obviously can't +// change the key, and for sets there is no value). +// +// We adhere mostly to the STL semantics for hash-map. One important +// exception is that insert() may invalidate iterators entirely -- STL +// semantics are that insert() may reorder iterators, but they all +// still refer to something valid in the hashtable. Not so for us. +// Likewise, insert() may invalidate pointers into the hashtable. +// (Whether insert invalidates iterators and pointers depends on +// whether it results in a hashtable resize). On the plus side, +// delete() doesn't invalidate iterators or pointers at all, or even +// change the ordering of elements. +// +// Here are a few "power user" tips: +// +// 1) set_deleted_key(): +// Unlike STL's hash_map, if you want to use erase() you +// *must* call set_deleted_key() after construction. +// +// 2) resize(0): +// When an item is deleted, its memory isn't freed right +// away. This allows you to iterate over a hashtable, +// and call erase(), without invalidating the iterator. +// To force the memory to be freed, call resize(0). +// For tr1 compatibility, this can also be called as rehash(0). +// +// 3) min_load_factor(0.0) +// Setting the minimum load factor to 0.0 guarantees that +// the hash table will never shrink. +// +// Roughly speaking: +// (1) dense_hash_set: fastest, uses the most memory unless entries are small +// (2) sparse_hash_set: slowest, uses the least memory +// (3) hash_set / unordered_set (STL): in the middle +// +// Typically I use sparse_hash_set when I care about space and/or when +// I need to save the hashtable on disk. I use hash_set otherwise. I +// don't personally use dense_hash_set ever; some people use it for +// small sets with lots of lookups. +// +// - dense_hash_set has, typically, about 78% memory overhead (if your +// data takes up X bytes, the hash_set uses .78X more bytes in overhead). +// - sparse_hash_set has about 4 bits overhead per entry. +// - sparse_hash_set can be 3-7 times slower than the others for lookup and, +// especially, inserts. See time_hash_map.cc for details. +// +// See /usr/(local/)?doc/sparsehash-*/sparse_hash_set.html +// for information about how to use this class. + +#ifndef _SPARSE_HASH_SET_H_ +#define _SPARSE_HASH_SET_H_ + +#include +#include // for FILE * in read()/write() +#include // for the default template args +#include // for equal_to +#include // for alloc<> +#include // for pair<> +#include HASH_FUN_H // defined in config.h +#include + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +template , // defined in sparseconfig.h + class EqualKey = STL_NAMESPACE::equal_to, + class Alloc = STL_NAMESPACE::allocator > +class sparse_hash_set { + private: + // Apparently identity is not stl-standard, so we define our own + struct Identity { + Value& operator()(Value& v) const { return v; } + const Value& operator()(const Value& v) const { return v; } + }; + struct SetKey { + void operator()(Value* value, const Value& new_key) const { + *value = new_key; + } + }; + + // The actual data + typedef sparse_hashtable ht; + ht rep; + + public: + typedef typename ht::key_type key_type; + typedef typename ht::value_type value_type; + typedef typename ht::hasher hasher; + typedef typename ht::key_equal key_equal; + typedef Alloc allocator_type; + + typedef typename ht::size_type size_type; + typedef typename ht::difference_type difference_type; + typedef typename ht::const_pointer pointer; + typedef typename ht::const_pointer const_pointer; + typedef typename ht::const_reference reference; + typedef typename ht::const_reference const_reference; + + typedef typename ht::const_iterator iterator; + typedef typename ht::const_iterator const_iterator; + typedef typename ht::const_local_iterator local_iterator; + typedef typename ht::const_local_iterator const_local_iterator; + + + // Iterator functions -- recall all iterators are const + iterator begin() const { return rep.begin(); } + iterator end() const { return rep.end(); } + + // These come from tr1's unordered_set. For us, a bucket has 0 or 1 elements. + local_iterator begin(size_type i) const { return rep.begin(i); } + local_iterator end(size_type i) const { return rep.end(i); } + + + // Accessor functions + // TODO(csilvers): implement Alloc get_allocator() const; + hasher hash_funct() const { return rep.hash_funct(); } + hasher hash_function() const { return hash_funct(); } // tr1 name + key_equal key_eq() const { return rep.key_eq(); } + + + // Constructors + explicit sparse_hash_set(size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { } + + template + sparse_hash_set(InputIterator f, InputIterator l, + size_type expected_max_items_in_table = 0, + const hasher& hf = hasher(), + const key_equal& eql = key_equal()) + : rep(expected_max_items_in_table, hf, eql) { + rep.insert(f, l); + } + // We use the default copy constructor + // We use the default operator=() + // We use the default destructor + + void clear() { rep.clear(); } + void swap(sparse_hash_set& hs) { rep.swap(hs.rep); } + + + // Functions concerning size + size_type size() const { return rep.size(); } + size_type max_size() const { return rep.max_size(); } + bool empty() const { return rep.empty(); } + size_type bucket_count() const { return rep.bucket_count(); } + size_type max_bucket_count() const { return rep.max_bucket_count(); } + + // These are tr1 methods. bucket() is the bucket the key is or would be in. + size_type bucket_size(size_type i) const { return rep.bucket_size(i); } + size_type bucket(const key_type& key) const { return rep.bucket(key); } + float load_factor() const { + return size() * 1.0f / bucket_count(); + } + float max_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return grow; + } + void max_load_factor(float new_grow) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(shrink, new_grow); + } + // These aren't tr1 methods but perhaps ought to be. + float min_load_factor() const { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + return shrink; + } + void min_load_factor(float new_shrink) { + float shrink, grow; + rep.get_resizing_parameters(&shrink, &grow); + rep.set_resizing_parameters(new_shrink, grow); + } + // Deprecated; use min_load_factor() or max_load_factor() instead. + void set_resizing_parameters(float shrink, float grow) { + return rep.set_resizing_parameters(shrink, grow); + } + + void resize(size_type hint) { rep.resize(hint); } + void rehash(size_type hint) { resize(hint); } // the tr1 name + + // Lookup routines + iterator find(const key_type& key) const { return rep.find(key); } + + size_type count(const key_type& key) const { return rep.count(key); } + + pair equal_range(const key_type& key) const { + return rep.equal_range(key); + } + + // Insertion routines + pair insert(const value_type& obj) { + pair p = rep.insert(obj); + return pair(p.first, p.second); // const to non-const + } + template + void insert(InputIterator f, InputIterator l) { rep.insert(f, l); } + void insert(const_iterator f, const_iterator l) { rep.insert(f, l); } + // required for std::insert_iterator; the passed-in iterator is ignored + iterator insert(iterator, const value_type& obj) { return insert(obj).first; } + + + // Deletion routines + // THESE ARE NON-STANDARD! I make you specify an "impossible" key + // value to identify deleted buckets. You can change the key as + // time goes on, or get rid of it entirely to be insert-only. + void set_deleted_key(const key_type& key) { rep.set_deleted_key(key); } + void clear_deleted_key() { rep.clear_deleted_key(); } + key_type deleted_key() const { return rep.deleted_key(); } + + // These are standard + size_type erase(const key_type& key) { return rep.erase(key); } + void erase(iterator it) { rep.erase(it); } + void erase(iterator f, iterator l) { rep.erase(f, l); } + + + // Comparison + bool operator==(const sparse_hash_set& hs) const { return rep == hs.rep; } + bool operator!=(const sparse_hash_set& hs) const { return rep != hs.rep; } + + + // I/O -- this is an add-on for writing metainformation to disk + bool write_metadata(FILE *fp) { return rep.write_metadata(fp); } + bool read_metadata(FILE *fp) { return rep.read_metadata(fp); } + bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); } + bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); } +}; + +template +inline void swap(sparse_hash_set& hs1, + sparse_hash_set& hs2) { + hs1.swap(hs2); +} + +_END_GOOGLE_NAMESPACE_ + +#endif /* _SPARSE_HASH_SET_H_ */ diff --git a/src/sparsehash-1.6/src/google/sparsehash/densehashtable.h b/src/sparsehash-1.6/src/google/sparsehash/densehashtable.h new file mode 100644 index 0000000..50d9b92 --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparsehash/densehashtable.h @@ -0,0 +1,1158 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// A dense hashtable is a particular implementation of +// a hashtable: one that is meant to minimize memory allocation. +// It does this by using an array to store all the data. We +// steal a value from the key space to indicate "empty" array +// elements (ie indices where no item lives) and another to indicate +// "deleted" elements. +// +// (Note it is possible to change the value of the delete key +// on the fly; you can even remove it, though after that point +// the hashtable is insert_only until you set it again. The empty +// value however can't be changed.) +// +// To minimize allocation and pointer overhead, we use internal +// probing, in which the hashtable is a single table, and collisions +// are resolved by trying to insert again in another bucket. The +// most cache-efficient internal probing schemes are linear probing +// (which suffers, alas, from clumping) and quadratic probing, which +// is what we implement by default. +// +// Type requirements: value_type is required to be Copy Constructible +// and Default Constructible. It is not required to be (and commonly +// isn't) Assignable. +// +// You probably shouldn't use this code directly. Use +// or instead. + +// You can change the following below: +// HT_OCCUPANCY_FLT -- how full before we double size +// HT_EMPTY_FLT -- how empty before we halve size +// HT_MIN_BUCKETS -- default smallest bucket size +// +// You can also change enlarge_resize_percent (which defaults to +// HT_OCCUPANCY_FLT), and shrink_resize_percent (which defaults to +// HT_EMPTY_FLT) with set_resizing_parameters(). +// +// How to decide what values to use? +// shrink_resize_percent's default of .4 * OCCUPANCY_FLT, is probably good. +// HT_MIN_BUCKETS is probably unnecessary since you can specify +// (indirectly) the starting number of buckets at construct-time. +// For enlarge_resize_percent, you can use this chart to try to trade-off +// expected lookup time to the space taken up. By default, this +// code uses quadratic probing, though you can change it to linear +// via _JUMP below if you really want to. +// +// From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html +// NUMBER OF PROBES / LOOKUP Successful Unsuccessful +// Quadratic collision resolution 1 - ln(1-L) - L/2 1/(1-L) - L - ln(1-L) +// Linear collision resolution [1+1/(1-L)]/2 [1+1/(1-L)2]/2 +// +// -- enlarge_resize_percent -- 0.10 0.50 0.60 0.75 0.80 0.90 0.99 +// QUADRATIC COLLISION RES. +// probes/successful lookup 1.05 1.44 1.62 2.01 2.21 2.85 5.11 +// probes/unsuccessful lookup 1.11 2.19 2.82 4.64 5.81 11.4 103.6 +// LINEAR COLLISION RES. +// probes/successful lookup 1.06 1.5 1.75 2.5 3.0 5.5 50.5 +// probes/unsuccessful lookup 1.12 2.5 3.6 8.5 13.0 50.0 5000.0 + +#ifndef _DENSEHASHTABLE_H_ +#define _DENSEHASHTABLE_H_ + +// The probing method +// Linear probing +// #define JUMP_(key, num_probes) ( 1 ) +// Quadratic-ish probing +#define JUMP_(key, num_probes) ( num_probes ) + + +#include +#include +#include +#include // for abort() +#include // For swap(), eg +#include // For length_error +#include // For cerr +#include // For uninitialized_fill, uninitialized_copy +#include // for pair<> +#include // for facts about iterator tags +#include // for true_type, integral_constant, etc. + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +// Hashtable class, used to implement the hashed associative containers +// hash_set and hash_map. + +// Value: what is stored in the table (each bucket is a Value). +// Key: something in a 1-to-1 correspondence to a Value, that can be used +// to search for a Value in the table (find() takes a Key). +// HashFcn: Takes a Key and returns an integer, the more unique the better. +// ExtractKey: given a Value, returns the unique Key associated with it. +// SetKey: given a Value* and a Key, modifies the value such that +// ExtractKey(value) == key. We guarantee this is only called +// with key == deleted_key or key == empty_key. +// EqualKey: Given two Keys, says whether they are the same (that is, +// if they are both associated with the same Value). +// Alloc: STL allocator to use to allocate memory. Currently ignored. + +template +class dense_hashtable; + +template +struct dense_hashtable_iterator; + +template +struct dense_hashtable_const_iterator; + +// We're just an array, but we need to skip over empty and deleted elements +template +struct dense_hashtable_iterator { + public: + typedef dense_hashtable_iterator iterator; + typedef dense_hashtable_const_iterator const_iterator; + + typedef STL_NAMESPACE::forward_iterator_tag iterator_category; + typedef V value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef V& reference; // Value + typedef V* pointer; + + // "Real" constructor and default constructor + dense_hashtable_iterator(const dense_hashtable *h, + pointer it, pointer it_end, bool advance) + : ht(h), pos(it), end(it_end) { + if (advance) advance_past_empty_and_deleted(); + } + dense_hashtable_iterator() { } + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *pos; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic. The only hard part is making sure that + // we're not on an empty or marked-deleted array element + void advance_past_empty_and_deleted() { + while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) ) + ++pos; + } + iterator& operator++() { + assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + + // Comparison. + bool operator==(const iterator& it) const { return pos == it.pos; } + bool operator!=(const iterator& it) const { return pos != it.pos; } + + + // The actual data + const dense_hashtable *ht; + pointer pos, end; +}; + + +// Now do it all again, but with const-ness! +template +struct dense_hashtable_const_iterator { + public: + typedef dense_hashtable_iterator iterator; + typedef dense_hashtable_const_iterator const_iterator; + + typedef STL_NAMESPACE::forward_iterator_tag iterator_category; + typedef V value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef const V& reference; // Value + typedef const V* pointer; + + // "Real" constructor and default constructor + dense_hashtable_const_iterator( + const dense_hashtable *h, + pointer it, pointer it_end, bool advance) + : ht(h), pos(it), end(it_end) { + if (advance) advance_past_empty_and_deleted(); + } + dense_hashtable_const_iterator() { } + // This lets us convert regular iterators to const iterators + dense_hashtable_const_iterator(const iterator &it) + : ht(it.ht), pos(it.pos), end(it.end) { } + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *pos; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic. The only hard part is making sure that + // we're not on an empty or marked-deleted array element + void advance_past_empty_and_deleted() { + while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) ) + ++pos; + } + const_iterator& operator++() { + assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this; + } + const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; } + + // Comparison. + bool operator==(const const_iterator& it) const { return pos == it.pos; } + bool operator!=(const const_iterator& it) const { return pos != it.pos; } + + + // The actual data + const dense_hashtable *ht; + pointer pos, end; +}; + +template +class dense_hashtable { + public: + typedef Key key_type; + typedef Value value_type; + typedef HashFcn hasher; + typedef EqualKey key_equal; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef dense_hashtable_iterator + iterator; + + typedef dense_hashtable_const_iterator + const_iterator; + + // These come from tr1. For us they're the same as regular iterators. + typedef iterator local_iterator; + typedef const_iterator const_local_iterator; + + // How full we let the table get before we resize, by default. + // Knuth says .8 is good -- higher causes us to probe too much, + // though it saves memory. + static const float HT_OCCUPANCY_FLT; // = 0.5; + + // How empty we let the table get before we resize lower, by default. + // (0.0 means never resize lower.) + // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing + static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT + + // Minimum size we're willing to let hashtables be. + // Must be a power of two, and at least 4. + // Note, however, that for a given hashtable, the initial size is a + // function of the first constructor arg, and may be >HT_MIN_BUCKETS. + static const size_t HT_MIN_BUCKETS = 4; + + // By default, if you don't specify a hashtable size at + // construction-time, we use this size. Must be a power of two, and + // at least HT_MIN_BUCKETS. + static const size_t HT_DEFAULT_STARTING_BUCKETS = 32; + + + // ITERATOR FUNCTIONS + iterator begin() { return iterator(this, table, + table + num_buckets, true); } + iterator end() { return iterator(this, table + num_buckets, + table + num_buckets, true); } + const_iterator begin() const { return const_iterator(this, table, + table+num_buckets,true);} + const_iterator end() const { return const_iterator(this, table + num_buckets, + table+num_buckets,true);} + + // These come from tr1 unordered_map. They iterate over 'bucket' n. + // For sparsehashtable, we could consider each 'group' to be a bucket, + // I guess, but I don't really see the point. We'll just consider + // bucket n to be the n-th element of the sparsetable, if it's occupied, + // or some empty element, otherwise. + local_iterator begin(size_type i) { + return local_iterator(this, table + i, table + i+1, false); + } + local_iterator end(size_type i) { + local_iterator it = begin(i); + if (!test_empty(i) && !test_deleted(i)) + ++it; + return it; + } + const_local_iterator begin(size_type i) const { + return const_local_iterator(this, table + i, table + i+1, false); + } + const_local_iterator end(size_type i) const { + const_local_iterator it = begin(i); + if (!test_empty(i) && !test_deleted(i)) + ++it; + return it; + } + + // ACCESSOR FUNCTIONS for the things we templatize on, basically + hasher hash_funct() const { return hash; } + key_equal key_eq() const { return equals; } + + // Accessor function for statistics gathering. + int num_table_copies() const { return num_ht_copies; } + + private: + // Annoyingly, we can't copy values around, because they might have + // const components (they're probably pair). We use + // explicit destructor invocation and placement new to get around + // this. Arg. + void set_value(value_type* dst, const value_type& src) { + dst->~value_type(); + new(dst) value_type(src); + } + + void destroy_buckets(size_type first, size_type last) { + for ( ; first != last; ++first) + table[first].~value_type(); + } + + // DELETE HELPER FUNCTIONS + // This lets the user describe a key that will indicate deleted + // table entries. This key should be an "impossible" entry -- + // if you try to insert it for real, you won't be able to retrieve it! + // (NB: while you pass in an entire value, only the key part is looked + // at. This is just because I don't know how to assign just a key.) + private: + void squash_deleted() { // gets rid of any deleted entries we have + if ( num_deleted ) { // get rid of deleted before writing + dense_hashtable tmp(*this); // copying will get rid of deleted + swap(tmp); // now we are tmp + } + assert(num_deleted == 0); + } + + bool test_deleted_key(const key_type& key) const { + // The num_deleted test is crucial for read(): after read(), the ht values + // are garbage, and we don't want to think some of them are deleted. + // Invariant: !use_deleted implies num_deleted is 0. + assert(use_deleted || num_deleted == 0); + return num_deleted > 0 && equals(delkey, key); + } + + public: + void set_deleted_key(const key_type &key) { + // the empty indicator (if specified) and the deleted indicator + // must be different + assert(!use_empty || !equals(key, get_key(emptyval))); + // It's only safe to change what "deleted" means if we purge deleted guys + squash_deleted(); + use_deleted = true; + delkey = key; + } + void clear_deleted_key() { + squash_deleted(); + use_deleted = false; + } + key_type deleted_key() const { + assert(use_deleted); + return delkey; + } + + // These are public so the iterators can use them + // True if the item at position bucknum is "deleted" marker + bool test_deleted(size_type bucknum) const { + return test_deleted_key(get_key(table[bucknum])); + } + bool test_deleted(const iterator &it) const { + return test_deleted_key(get_key(*it)); + } + bool test_deleted(const const_iterator &it) const { + return test_deleted_key(get_key(*it)); + } + + // Set it so test_deleted is true. true if object didn't used to be deleted. + bool set_deleted(iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + bool retval = !test_deleted(it); + // &* converts from iterator to value-type. + set_key(&(*it), delkey); + return retval; + } + // Set it so test_deleted is false. true if object used to be deleted + bool clear_deleted(iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + // Happens automatically when we assign something else in its place. + return test_deleted(it); + } + + // We also allow to set/clear the deleted bit on a const iterator. + // We allow a const_iterator for the same reason you can delete a + // const pointer: it's convenient, and semantically you can't use + // 'it' after it's been deleted anyway, so its const-ness doesn't + // really matter. + bool set_deleted(const_iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + bool retval = !test_deleted(it); + set_key(const_cast(&(*it)), delkey); + return retval; + } + // Set it so test_deleted is false. true if object used to be deleted + bool clear_deleted(const_iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + return test_deleted(it); + } + + // EMPTY HELPER FUNCTIONS + // This lets the user describe a key that will indicate empty (unused) + // table entries. This key should be an "impossible" entry -- + // if you try to insert it for real, you won't be able to retrieve it! + // (NB: while you pass in an entire value, only the key part is looked + // at. This is just because I don't know how to assign just a key.) + public: + // These are public so the iterators can use them + // True if the item at position bucknum is "empty" marker + bool test_empty(size_type bucknum) const { + assert(use_empty); // we always need to know what's empty! + return equals(get_key(emptyval), get_key(table[bucknum])); + } + bool test_empty(const iterator &it) const { + assert(use_empty); // we always need to know what's empty! + return equals(get_key(emptyval), get_key(*it)); + } + bool test_empty(const const_iterator &it) const { + assert(use_empty); // we always need to know what's empty! + return equals(get_key(emptyval), get_key(*it)); + } + + private: + // You can either set a range empty or an individual element + void set_empty(size_type bucknum) { + assert(use_empty); + set_value(&table[bucknum], emptyval); + } + void fill_range_with_empty(value_type* table_start, value_type* table_end) { + // Like set_empty(range), but doesn't destroy previous contents + STL_NAMESPACE::uninitialized_fill(table_start, table_end, emptyval); + } + void set_empty(size_type buckstart, size_type buckend) { + assert(use_empty); + destroy_buckets(buckstart, buckend); + fill_range_with_empty(table + buckstart, table + buckend); + } + + public: + // TODO(csilvers): change all callers of this to pass in a key instead, + // and take a const key_type instead of const value_type. + void set_empty_key(const value_type &val) { + // Once you set the empty key, you can't change it + assert(!use_empty); + // The deleted indicator (if specified) and the empty indicator + // must be different. + assert(!use_deleted || !equals(get_key(val), delkey)); + use_empty = true; + set_value(&emptyval, val); + + assert(!table); // must set before first use + // num_buckets was set in constructor even though table was NULL + table = (value_type *) malloc(num_buckets * sizeof(*table)); + assert(table); + fill_range_with_empty(table, table + num_buckets); + } + // TODO(sjackman): return a key_type rather than a value_type + value_type empty_key() const { + assert(use_empty); + return emptyval; + } + + // FUNCTIONS CONCERNING SIZE + public: + size_type size() const { return num_elements - num_deleted; } + // Buckets are always a power of 2 + size_type max_size() const { return (size_type(-1) >> 1U) + 1; } + bool empty() const { return size() == 0; } + size_type bucket_count() const { return num_buckets; } + size_type max_bucket_count() const { return max_size(); } + size_type nonempty_bucket_count() const { return num_elements; } + // These are tr1 methods. Their idea of 'bucket' doesn't map well to + // what we do. We just say every bucket has 0 or 1 items in it. + size_type bucket_size(size_type i) const { + return begin(i) == end(i) ? 0 : 1; + } + + + + private: + // Because of the above, size_type(-1) is never legal; use it for errors + static const size_type ILLEGAL_BUCKET = size_type(-1); + + private: + // This is the smallest size a hashtable can be without being too crowded + // If you like, you can give a min #buckets as well as a min #elts + size_type min_size(size_type num_elts, size_type min_buckets_wanted) { + size_type sz = HT_MIN_BUCKETS; // min buckets allowed + while ( sz < min_buckets_wanted || + num_elts >= static_cast(sz * enlarge_resize_percent) ) { + if (sz * 2 < sz) + throw std::length_error("resize overflow"); // protect against overflow + sz *= 2; + } + return sz; + } + + // Used after a string of deletes + void maybe_shrink() { + assert(num_elements >= num_deleted); + assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two + assert(bucket_count() >= HT_MIN_BUCKETS); + + // If you construct a hashtable with < HT_DEFAULT_STARTING_BUCKETS, + // we'll never shrink until you get relatively big, and we'll never + // shrink below HT_DEFAULT_STARTING_BUCKETS. Otherwise, something + // like "dense_hash_set x; x.insert(4); x.erase(4);" will + // shrink us down to HT_MIN_BUCKETS buckets, which is too small. + if (shrink_threshold > 0 && + (num_elements-num_deleted) < shrink_threshold && + bucket_count() > HT_DEFAULT_STARTING_BUCKETS ) { + size_type sz = bucket_count() / 2; // find how much we should shrink + while ( sz > HT_DEFAULT_STARTING_BUCKETS && + (num_elements - num_deleted) < sz * shrink_resize_percent ) + sz /= 2; // stay a power of 2 + dense_hashtable tmp(*this, sz); // Do the actual resizing + swap(tmp); // now we are tmp + } + consider_shrink = false; // because we just considered it + } + + // We'll let you resize a hashtable -- though this makes us copy all! + // When you resize, you say, "make it big enough for this many more elements" + void resize_delta(size_type delta) { + if ( consider_shrink ) // see if lots of deletes happened + maybe_shrink(); + if ( bucket_count() > HT_MIN_BUCKETS && + (num_elements + delta) <= enlarge_threshold ) + return; // we're ok as we are + + // Sometimes, we need to resize just to get rid of all the + // "deleted" buckets that are clogging up the hashtable. So when + // deciding whether to resize, count the deleted buckets (which + // are currently taking up room). But later, when we decide what + // size to resize to, *don't* count deleted buckets, since they + // get discarded during the resize. + const size_type needed_size = min_size(num_elements + delta, 0); + if ( needed_size > bucket_count() ) { // we don't have enough buckets + size_type resize_to = min_size(num_elements - num_deleted + delta, + bucket_count()); + if (resize_to < needed_size) { + // This situation means that we have enough deleted elements, + // that once we purge them, we won't actually have needed to + // grow. But we may want to grow anyway: if we just purge one + // element, say, we'll have to grow anyway next time we + // insert. Might as well grow now, since we're already going + // through the trouble of copying (in order to purge the + // deleted elements). + if (num_elements - num_deleted + delta >= + static_cast(resize_to*2 * shrink_resize_percent)) { + // Good, we won't be below the shrink threshhold even if we double. + resize_to *= 2; + } + } + dense_hashtable tmp(*this, resize_to); + swap(tmp); // now we are tmp + } + } + + // Increase number of buckets, assuming value_type has trivial copy + // constructor and destructor. (Really, we want it to have "trivial + // move", because that's what realloc does. But there's no way to + // capture that using type_traits, so we pretend that move(x, y) is + // equivalent to "x.~T(); new(x) T(y);" which is pretty much + // correct, if a bit conservative.) + void expand_array(size_t resize_to, true_type) { + table = (value_type *) realloc(table, resize_to * sizeof(value_type)); + assert(table); + fill_range_with_empty(table + num_buckets, table + resize_to); + } + + // Increase number of buckets, without special assumptions about value_type. + // TODO(austern): make this exception safe. Handle exceptions from + // value_type's copy constructor. + void expand_array(size_t resize_to, false_type) { + value_type* new_table = + (value_type *) malloc(resize_to * sizeof(value_type)); + assert(new_table); + STL_NAMESPACE::uninitialized_copy(table, table + num_buckets, new_table); + fill_range_with_empty(new_table + num_buckets, new_table + resize_to); + destroy_buckets(0, num_buckets); + free(table); + table = new_table; + } + + // Used to actually do the rehashing when we grow/shrink a hashtable + void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted) { + clear(); // clear table, set num_deleted to 0 + + // If we need to change the size of our table, do it now + const size_type resize_to = min_size(ht.size(), min_buckets_wanted); + if ( resize_to > bucket_count() ) { // we don't have enough buckets + typedef integral_constant::value && + has_trivial_destructor::value)> + realloc_ok; // we pretend mv(x,y) == "x.~T(); new(x) T(y)" + expand_array(resize_to, realloc_ok()); + num_buckets = resize_to; + reset_thresholds(); + } + + // We use a normal iterator to get non-deleted bcks from ht + // We could use insert() here, but since we know there are + // no duplicates and no deleted items, we can be more efficient + assert((bucket_count() & (bucket_count()-1)) == 0); // a power of two + for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) { + size_type num_probes = 0; // how many times we've probed + size_type bucknum; + const size_type bucket_count_minus_one = bucket_count() - 1; + for (bucknum = hash(get_key(*it)) & bucket_count_minus_one; + !test_empty(bucknum); // not empty + bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) { + ++num_probes; + assert(num_probes < bucket_count()); // or else the hashtable is full + } + set_value(&table[bucknum], *it); // copies the value to here + num_elements++; + } + num_ht_copies++; + } + + // Required by the spec for hashed associative container + public: + // Though the docs say this should be num_buckets, I think it's much + // more useful as req_elements. As a special feature, calling with + // req_elements==0 will cause us to shrink if we can, saving space. + void resize(size_type req_elements) { // resize to this or larger + if ( consider_shrink || req_elements == 0 ) + maybe_shrink(); + if ( req_elements > num_elements ) + return resize_delta(req_elements - num_elements); + } + + // Get and change the value of shrink_resize_percent and + // enlarge_resize_percent. The description at the beginning of this + // file explains how to choose the values. Setting the shrink + // parameter to 0.0 ensures that the table never shrinks. + void get_resizing_parameters(float* shrink, float* grow) const { + *shrink = shrink_resize_percent; + *grow = enlarge_resize_percent; + } + void set_resizing_parameters(float shrink, float grow) { + assert(shrink >= 0.0); + assert(grow <= 1.0); + if (shrink > grow/2.0f) + shrink = grow / 2.0f; // otherwise we thrash hashtable size + shrink_resize_percent = shrink; + enlarge_resize_percent = grow; + reset_thresholds(); + } + + // CONSTRUCTORS -- as required by the specs, we take a size, + // but also let you specify a hashfunction, key comparator, + // and key extractor. We also define a copy constructor and =. + // DESTRUCTOR -- needs to free the table + explicit dense_hashtable(size_type expected_max_items_in_table = 0, + const HashFcn& hf = HashFcn(), + const EqualKey& eql = EqualKey(), + const ExtractKey& ext = ExtractKey(), + const SetKey& set = SetKey()) + : hash(hf), equals(eql), get_key(ext), set_key(set), num_deleted(0), + use_deleted(false), use_empty(false), + delkey(), emptyval(), enlarge_resize_percent(HT_OCCUPANCY_FLT), + shrink_resize_percent(HT_EMPTY_FLT), table(NULL), + num_buckets(expected_max_items_in_table == 0 + ? HT_DEFAULT_STARTING_BUCKETS + : min_size(expected_max_items_in_table, 0)), + num_elements(0), num_ht_copies(0) { + // table is NULL until emptyval is set. However, we set num_buckets + // here so we know how much space to allocate once emptyval is set + reset_thresholds(); + } + + // As a convenience for resize(), we allow an optional second argument + // which lets you make this new hashtable a different size than ht + dense_hashtable(const dense_hashtable& ht, + size_type min_buckets_wanted = HT_DEFAULT_STARTING_BUCKETS) + : hash(ht.hash), equals(ht.equals), + get_key(ht.get_key), set_key(ht.set_key), num_deleted(0), + use_deleted(ht.use_deleted), use_empty(ht.use_empty), + delkey(ht.delkey), emptyval(ht.emptyval), + enlarge_resize_percent(ht.enlarge_resize_percent), + shrink_resize_percent(ht.shrink_resize_percent), table(NULL), + num_buckets(0), num_elements(0), num_ht_copies(ht.num_ht_copies) { + if (!ht.use_empty) { + // If use_empty isn't set, copy_from will crash, so we do our own copying. + assert(ht.empty()); + num_buckets = min_size(ht.size(), min_buckets_wanted); + reset_thresholds(); + return; + } + reset_thresholds(); + copy_from(ht, min_buckets_wanted); // copy_from() ignores deleted entries + } + + dense_hashtable& operator= (const dense_hashtable& ht) { + if (&ht == this) return *this; // don't copy onto ourselves + if (!ht.use_empty) { + assert(ht.empty()); + dense_hashtable empty_table(ht); // empty table with ht's thresholds + this->swap(empty_table); + return *this; + } + hash = ht.hash; + equals = ht.equals; + get_key = ht.get_key; + set_key = ht.set_key; + use_deleted = ht.use_deleted; + use_empty = ht.use_empty; + delkey = ht.delkey; + set_value(&emptyval, ht.emptyval); + enlarge_resize_percent = ht.enlarge_resize_percent; + shrink_resize_percent = ht.shrink_resize_percent; + copy_from(ht, HT_MIN_BUCKETS); // calls clear and sets num_deleted to 0 too + return *this; + } + + ~dense_hashtable() { + if (table) { + destroy_buckets(0, num_buckets); + free(table); + } + } + + // Many STL algorithms use swap instead of copy constructors + void swap(dense_hashtable& ht) { + STL_NAMESPACE::swap(hash, ht.hash); + STL_NAMESPACE::swap(equals, ht.equals); + STL_NAMESPACE::swap(get_key, ht.get_key); + STL_NAMESPACE::swap(set_key, ht.set_key); + STL_NAMESPACE::swap(num_deleted, ht.num_deleted); + STL_NAMESPACE::swap(use_deleted, ht.use_deleted); + STL_NAMESPACE::swap(use_empty, ht.use_empty); + STL_NAMESPACE::swap(enlarge_resize_percent, ht.enlarge_resize_percent); + STL_NAMESPACE::swap(shrink_resize_percent, ht.shrink_resize_percent); + STL_NAMESPACE::swap(delkey, ht.delkey); + { value_type tmp; // for annoying reasons, swap() doesn't work + set_value(&tmp, emptyval); + set_value(&emptyval, ht.emptyval); + set_value(&ht.emptyval, tmp); + } + STL_NAMESPACE::swap(table, ht.table); + STL_NAMESPACE::swap(num_buckets, ht.num_buckets); + STL_NAMESPACE::swap(num_elements, ht.num_elements); + STL_NAMESPACE::swap(num_ht_copies, ht.num_ht_copies); + reset_thresholds(); + ht.reset_thresholds(); + } + + // It's always nice to be able to clear a table without deallocating it + void clear() { + const size_type new_num_buckets = min_size(0,0); + if (num_elements == 0 && + num_deleted == 0 && + new_num_buckets == num_buckets) { + // Table is already empty, and the number of buckets is already as we + // desire, so nothing to do. + return; + } + if (table) + destroy_buckets(0, num_buckets); + if (!table || (new_num_buckets != num_buckets)) { + // Recompute the resize thresholds and realloc the table only if we're + // actually changing its size. + num_buckets = new_num_buckets; // our new size + reset_thresholds(); + table = (value_type *) realloc(table, num_buckets * sizeof(*table)); + } + assert(table); + fill_range_with_empty(table, table + num_buckets); + num_elements = 0; + num_deleted = 0; + } + + // Clear the table without resizing it. + // Mimicks the stl_hashtable's behaviour when clear()-ing in that it + // does not modify the bucket count + void clear_no_resize() { + if (table) { + set_empty(0, num_buckets); + } + // don't consider to shrink before another erase() + reset_thresholds(); + num_elements = 0; + num_deleted = 0; + } + + // LOOKUP ROUTINES + private: + // Returns a pair of positions: 1st where the object is, 2nd where + // it would go if you wanted to insert it. 1st is ILLEGAL_BUCKET + // if object is not found; 2nd is ILLEGAL_BUCKET if it is. + // Note: because of deletions where-to-insert is not trivial: it's the + // first deleted bucket we see, as long as we don't find the key later + pair find_position(const key_type &key) const { + size_type num_probes = 0; // how many times we've probed + const size_type bucket_count_minus_one = bucket_count() - 1; + size_type bucknum = hash(key) & bucket_count_minus_one; + size_type insert_pos = ILLEGAL_BUCKET; // where we would insert + while ( 1 ) { // probe until something happens + if ( test_empty(bucknum) ) { // bucket is empty + if ( insert_pos == ILLEGAL_BUCKET ) // found no prior place to insert + return pair(ILLEGAL_BUCKET, bucknum); + else + return pair(ILLEGAL_BUCKET, insert_pos); + + } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert + if ( insert_pos == ILLEGAL_BUCKET ) + insert_pos = bucknum; + + } else if ( equals(key, get_key(table[bucknum])) ) { + return pair(bucknum, ILLEGAL_BUCKET); + } + ++num_probes; // we're doing another probe + bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one; + assert(num_probes < bucket_count()); // don't probe too many times! + } + } + + public: + iterator find(const key_type& key) { + if ( size() == 0 ) return end(); + pair pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) // alas, not there + return end(); + else + return iterator(this, table + pos.first, table + num_buckets, false); + } + + const_iterator find(const key_type& key) const { + if ( size() == 0 ) return end(); + pair pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) // alas, not there + return end(); + else + return const_iterator(this, table + pos.first, table+num_buckets, false); + } + + // This is a tr1 method: the bucket a given key is in, or what bucket + // it would be put in, if it were to be inserted. Shrug. + size_type bucket(const key_type& key) const { + pair pos = find_position(key); + return pos.first == ILLEGAL_BUCKET ? pos.second : pos.first; + } + + // Counts how many elements have key key. For maps, it's either 0 or 1. + size_type count(const key_type &key) const { + pair pos = find_position(key); + return pos.first == ILLEGAL_BUCKET ? 0 : 1; + } + + // Likewise, equal_range doesn't really make sense for us. Oh well. + pair equal_range(const key_type& key) { + iterator pos = find(key); // either an iterator or end + if (pos == end()) { + return pair(pos, pos); + } else { + const iterator startpos = pos++; + return pair(startpos, pos); + } + } + pair equal_range(const key_type& key) const { + const_iterator pos = find(key); // either an iterator or end + if (pos == end()) { + return pair(pos, pos); + } else { + const const_iterator startpos = pos++; + return pair(startpos, pos); + } + } + + + // INSERTION ROUTINES + private: + // If you know *this is big enough to hold obj, use this routine + pair insert_noresize(const value_type& obj) { + // First, double-check we're not inserting delkey or emptyval + assert(!use_empty || !equals(get_key(obj), get_key(emptyval))); + assert(!use_deleted || !equals(get_key(obj), delkey)); + const pair pos = find_position(get_key(obj)); + if ( pos.first != ILLEGAL_BUCKET) { // object was already there + return pair(iterator(this, table + pos.first, + table + num_buckets, false), + false); // false: we didn't insert + } else { // pos.second says where to put it + if ( test_deleted(pos.second) ) { // just replace if it's been del. + const_iterator delpos(this, table + pos.second, // shrug: + table + num_buckets, false);// shouldn't need const + clear_deleted(delpos); + assert( num_deleted > 0); + --num_deleted; // used to be, now it isn't + } else { + ++num_elements; // replacing an empty bucket + } + set_value(&table[pos.second], obj); + return pair(iterator(this, table + pos.second, + table + num_buckets, false), + true); // true: we did insert + } + } + + public: + // This is the normal insert routine, used by the outside world + pair insert(const value_type& obj) { + resize_delta(1); // adding an object, grow if need be + return insert_noresize(obj); + } + + // When inserting a lot at a time, we specialize on the type of iterator + template + void insert(InputIterator f, InputIterator l) { + // specializes on iterator type + insert(f, l, typename STL_NAMESPACE::iterator_traits::iterator_category()); + } + + // Iterator supports operator-, resize before inserting + template + void insert(ForwardIterator f, ForwardIterator l, + STL_NAMESPACE::forward_iterator_tag) { + size_type n = STL_NAMESPACE::distance(f, l); // TODO(csilvers): standard? + resize_delta(n); + for ( ; n > 0; --n, ++f) + insert_noresize(*f); + } + + // Arbitrary iterator, can't tell how much to resize + template + void insert(InputIterator f, InputIterator l, + STL_NAMESPACE::input_iterator_tag) { + for ( ; f != l; ++f) + insert(*f); + } + + + // DELETION ROUTINES + size_type erase(const key_type& key) { + // First, double-check we're not trying to erase delkey or emptyval + assert(!use_empty || !equals(key, get_key(emptyval))); + assert(!use_deleted || !equals(key, delkey)); + const_iterator pos = find(key); // shrug: shouldn't need to be const + if ( pos != end() ) { + assert(!test_deleted(pos)); // or find() shouldn't have returned it + set_deleted(pos); + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + return 1; // because we deleted one thing + } else { + return 0; // because we deleted nothing + } + } + + // We return the iterator past the deleted item. + void erase(iterator pos) { + if ( pos == end() ) return; // sanity check + if ( set_deleted(pos) ) { // true if object has been newly deleted + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + } + } + + void erase(iterator f, iterator l) { + for ( ; f != l; ++f) { + if ( set_deleted(f) ) // should always be true + ++num_deleted; + } + consider_shrink = true; // will think about shrink after next insert + } + + // We allow you to erase a const_iterator just like we allow you to + // erase an iterator. This is in parallel to 'delete': you can delete + // a const pointer just like a non-const pointer. The logic is that + // you can't use the object after it's erased anyway, so it doesn't matter + // if it's const or not. + void erase(const_iterator pos) { + if ( pos == end() ) return; // sanity check + if ( set_deleted(pos) ) { // true if object has been newly deleted + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + } + } + void erase(const_iterator f, const_iterator l) { + for ( ; f != l; ++f) { + if ( set_deleted(f) ) // should always be true + ++num_deleted; + } + consider_shrink = true; // will think about shrink after next insert + } + + + // COMPARISON + bool operator==(const dense_hashtable& ht) const { + if (size() != ht.size()) { + return false; + } else if (this == &ht) { + return true; + } else { + // Iterate through the elements in "this" and see if the + // corresponding element is in ht + for ( const_iterator it = begin(); it != end(); ++it ) { + const_iterator it2 = ht.find(get_key(*it)); + if ((it2 == ht.end()) || (*it != *it2)) { + return false; + } + } + return true; + } + } + bool operator!=(const dense_hashtable& ht) const { + return !(*this == ht); + } + + + // I/O + // We support reading and writing hashtables to disk. Alas, since + // I don't know how to write a hasher or key_equal, you have to make + // sure everything but the table is the same. We compact before writing + // + // NOTE: These functions are currently TODO. They've not been implemented. + bool write_metadata(FILE *fp) { + squash_deleted(); // so we don't have to worry about delkey + return false; // TODO + } + + bool read_metadata(FILE *fp) { + num_deleted = 0; // since we got rid before writing + assert(use_empty); // have to set this before calling us + if (table) free(table); // we'll make our own + // TODO: read magic number + // TODO: read num_buckets + reset_thresholds(); + table = (value_type *) malloc(num_buckets * sizeof(*table)); + assert(table); + fill_range_with_empty(table, table + num_buckets); + // TODO: read num_elements + for ( size_type i = 0; i < num_elements; ++i ) { + // TODO: read bucket_num + // TODO: set with non-empty, non-deleted value + } + return false; // TODO + } + + // If your keys and values are simple enough, we can write them to + // disk for you. "simple enough" means value_type is a POD type + // that contains no pointers. However, we don't try to normalize + // endianness + bool write_nopointer_data(FILE *fp) const { + for ( const_iterator it = begin(); it != end(); ++it ) { + // TODO: skip empty/deleted values + if ( !fwrite(&*it, sizeof(*it), 1, fp) ) return false; + } + return false; + } + + // When reading, we have to override the potential const-ness of *it + bool read_nopointer_data(FILE *fp) { + for ( iterator it = begin(); it != end(); ++it ) { + // TODO: skip empty/deleted values + if ( !fread(reinterpret_cast(&(*it)), sizeof(*it), 1, fp) ) + return false; + } + return false; + } + + private: + // The actual data + hasher hash; // required by hashed_associative_container + key_equal equals; + ExtractKey get_key; + SetKey set_key; + size_type num_deleted; // how many occupied buckets are marked deleted + bool use_deleted; // false until delkey has been set + bool use_empty; // you must do this before you start + // TODO(csilvers): make a pointer, and get rid of use_deleted (benchmark!) + key_type delkey; // which key marks deleted entries + value_type emptyval; // which key marks unused entries + float enlarge_resize_percent; // how full before resize + float shrink_resize_percent; // how empty before resize + size_type shrink_threshold; // num_buckets * shrink_resize_percent + size_type enlarge_threshold; // num_buckets * enlarge_resize_percent + value_type *table; + size_type num_buckets; + size_type num_elements; + int num_ht_copies; // a statistics counter incremented every Copy + bool consider_shrink; // true if we should try to shrink before next insert + + void reset_thresholds() { + enlarge_threshold = static_cast(num_buckets + * enlarge_resize_percent); + shrink_threshold = static_cast(num_buckets + * shrink_resize_percent); + consider_shrink = false; // whatever caused us to reset already considered + } +}; + +// We need a global swap as well +template +inline void swap(dense_hashtable &x, + dense_hashtable &y) { + x.swap(y); +} + +#undef JUMP_ + +template +const typename dense_hashtable::size_type +dense_hashtable::ILLEGAL_BUCKET; + +// How full we let the table get before we resize. Knuth says .8 is +// good -- higher causes us to probe too much, though saves memory. +// However, we go with .5, getting better performance at the cost of +// more space (a trade-off densehashtable explicitly chooses to make). +// Feel free to play around with different values, though. +template +const float dense_hashtable::HT_OCCUPANCY_FLT = 0.5f; + +// How empty we let the table get before we resize lower. +// It should be less than OCCUPANCY_FLT / 2 or we thrash resizing +template +const float dense_hashtable::HT_EMPTY_FLT + = 0.4f * dense_hashtable::HT_OCCUPANCY_FLT; + +_END_GOOGLE_NAMESPACE_ + +#endif /* _DENSEHASHTABLE_H_ */ diff --git a/src/sparsehash-1.6/src/google/sparsehash/sparseconfig.h b/src/sparsehash-1.6/src/google/sparsehash/sparseconfig.h new file mode 100644 index 0000000..f397d3b --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparsehash/sparseconfig.h @@ -0,0 +1,49 @@ +/* + * NOTE: This file is for internal use only. + * Do not use these #defines in your own program! + */ + +/* Namespace for Google classes */ +#define GOOGLE_NAMESPACE ::google + +/* the location of the header defining hash functions */ +#define HASH_FUN_H + +/* the namespace of the hash<> function */ +#define HASH_NAMESPACE std::tr1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `u_int16_t'. */ +#define HAVE_U_INT16_T 1 + +/* Define to 1 if the system has the type `__uint16'. */ +/* #undef HAVE___UINT16 */ + +/* The system-provided hash function including the namespace. */ +#define SPARSEHASH_HASH HASH_NAMESPACE::hash + +/* the namespace where STL code like vector<> is defined */ +#define STL_NAMESPACE std + +/* Stops putting the code inside the Google namespace */ +#define _END_GOOGLE_NAMESPACE_ } + +/* Puts following code inside the Google namespace */ +#define _START_GOOGLE_NAMESPACE_ namespace google { diff --git a/src/sparsehash-1.6/src/google/sparsehash/sparsehashtable.h b/src/sparsehash-1.6/src/google/sparsehash/sparsehashtable.h new file mode 100644 index 0000000..62c9dc8 --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparsehash/sparsehashtable.h @@ -0,0 +1,1081 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// A sparse hashtable is a particular implementation of +// a hashtable: one that is meant to minimize memory use. +// It does this by using a *sparse table* (cf sparsetable.h), +// which uses between 1 and 2 bits to store empty buckets +// (we may need another bit for hashtables that support deletion). +// +// When empty buckets are so cheap, an appealing hashtable +// implementation is internal probing, in which the hashtable +// is a single table, and collisions are resolved by trying +// to insert again in another bucket. The most cache-efficient +// internal probing schemes are linear probing (which suffers, +// alas, from clumping) and quadratic probing, which is what +// we implement by default. +// +// Deleted buckets are a bit of a pain. We have to somehow mark +// deleted buckets (the probing must distinguish them from empty +// buckets). The most principled way is to have another bitmap, +// but that's annoying and takes up space. Instead we let the +// user specify an "impossible" key. We set deleted buckets +// to have the impossible key. +// +// Note it is possible to change the value of the delete key +// on the fly; you can even remove it, though after that point +// the hashtable is insert_only until you set it again. +// +// You probably shouldn't use this code directly. Use +// or instead. +// +// You can modify the following, below: +// HT_OCCUPANCY_FLT -- how full before we double size +// HT_EMPTY_FLT -- how empty before we halve size +// HT_MIN_BUCKETS -- smallest bucket size +// HT_DEFAULT_STARTING_BUCKETS -- default bucket size at construct-time +// +// You can also change enlarge_resize_percent (which defaults to +// HT_OCCUPANCY_FLT), and shrink_resize_percent (which defaults to +// HT_EMPTY_FLT) with set_resizing_parameters(). +// +// How to decide what values to use? +// shrink_resize_percent's default of .4 * OCCUPANCY_FLT, is probably good. +// HT_MIN_BUCKETS is probably unnecessary since you can specify +// (indirectly) the starting number of buckets at construct-time. +// For enlarge_resize_percent, you can use this chart to try to trade-off +// expected lookup time to the space taken up. By default, this +// code uses quadratic probing, though you can change it to linear +// via _JUMP below if you really want to. +// +// From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html +// NUMBER OF PROBES / LOOKUP Successful Unsuccessful +// Quadratic collision resolution 1 - ln(1-L) - L/2 1/(1-L) - L - ln(1-L) +// Linear collision resolution [1+1/(1-L)]/2 [1+1/(1-L)2]/2 +// +// -- enlarge_resize_percent -- 0.10 0.50 0.60 0.75 0.80 0.90 0.99 +// QUADRATIC COLLISION RES. +// probes/successful lookup 1.05 1.44 1.62 2.01 2.21 2.85 5.11 +// probes/unsuccessful lookup 1.11 2.19 2.82 4.64 5.81 11.4 103.6 +// LINEAR COLLISION RES. +// probes/successful lookup 1.06 1.5 1.75 2.5 3.0 5.5 50.5 +// probes/unsuccessful lookup 1.12 2.5 3.6 8.5 13.0 50.0 5000.0 +// +// The value type is required to be copy constructible and default +// constructible, but it need not be (and commonly isn't) assignable. + +#ifndef _SPARSEHASHTABLE_H_ +#define _SPARSEHASHTABLE_H_ + +#ifndef SPARSEHASH_STAT_UPDATE +#define SPARSEHASH_STAT_UPDATE(x) ((void) 0) +#endif + +// The probing method +// Linear probing +// #define JUMP_(key, num_probes) ( 1 ) +// Quadratic-ish probing +#define JUMP_(key, num_probes) ( num_probes ) + + +#include +#include +#include // For swap(), eg +#include // For length_error +#include // for facts about iterator tags +#include // for pair<> +#include // Since that's basically what we are + +_START_GOOGLE_NAMESPACE_ + +using STL_NAMESPACE::pair; + +// Hashtable class, used to implement the hashed associative containers +// hash_set and hash_map. +// +// Value: what is stored in the table (each bucket is a Value). +// Key: something in a 1-to-1 correspondence to a Value, that can be used +// to search for a Value in the table (find() takes a Key). +// HashFcn: Takes a Key and returns an integer, the more unique the better. +// ExtractKey: given a Value, returns the unique Key associated with it. +// SetKey: given a Value* and a Key, modifies the value such that +// ExtractKey(value) == key. We guarantee this is only called +// with key == deleted_key. +// EqualKey: Given two Keys, says whether they are the same (that is, +// if they are both associated with the same Value). +// Alloc: STL allocator to use to allocate memory. Currently ignored. + +template +class sparse_hashtable; + +template +struct sparse_hashtable_iterator; + +template +struct sparse_hashtable_const_iterator; + +// As far as iterating, we're basically just a sparsetable +// that skips over deleted elements. +template +struct sparse_hashtable_iterator { + public: + typedef sparse_hashtable_iterator iterator; + typedef sparse_hashtable_const_iterator const_iterator; + typedef typename sparsetable::nonempty_iterator st_iterator; + + typedef STL_NAMESPACE::forward_iterator_tag iterator_category; + typedef V value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef V& reference; // Value + typedef V* pointer; + + // "Real" constructor and default constructor + sparse_hashtable_iterator(const sparse_hashtable *h, + st_iterator it, st_iterator it_end) + : ht(h), pos(it), end(it_end) { advance_past_deleted(); } + sparse_hashtable_iterator() { } // not ever used internally + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *pos; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic. The only hard part is making sure that + // we're not on a marked-deleted array element + void advance_past_deleted() { + while ( pos != end && ht->test_deleted(*this) ) + ++pos; + } + iterator& operator++() { + assert(pos != end); ++pos; advance_past_deleted(); return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + + // Comparison. + bool operator==(const iterator& it) const { return pos == it.pos; } + bool operator!=(const iterator& it) const { return pos != it.pos; } + + + // The actual data + const sparse_hashtable *ht; + st_iterator pos, end; +}; + +// Now do it all again, but with const-ness! +template +struct sparse_hashtable_const_iterator { + public: + typedef sparse_hashtable_iterator iterator; + typedef sparse_hashtable_const_iterator const_iterator; + typedef typename sparsetable::const_nonempty_iterator st_iterator; + + typedef STL_NAMESPACE::forward_iterator_tag iterator_category; + typedef V value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef const V& reference; // Value + typedef const V* pointer; + + // "Real" constructor and default constructor + sparse_hashtable_const_iterator(const sparse_hashtable *h, + st_iterator it, st_iterator it_end) + : ht(h), pos(it), end(it_end) { advance_past_deleted(); } + // This lets us convert regular iterators to const iterators + sparse_hashtable_const_iterator() { } // never used internally + sparse_hashtable_const_iterator(const iterator &it) + : ht(it.ht), pos(it.pos), end(it.end) { } + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *pos; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic. The only hard part is making sure that + // we're not on a marked-deleted array element + void advance_past_deleted() { + while ( pos != end && ht->test_deleted(*this) ) + ++pos; + } + const_iterator& operator++() { + assert(pos != end); ++pos; advance_past_deleted(); return *this; + } + const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; } + + // Comparison. + bool operator==(const const_iterator& it) const { return pos == it.pos; } + bool operator!=(const const_iterator& it) const { return pos != it.pos; } + + + // The actual data + const sparse_hashtable *ht; + st_iterator pos, end; +}; + +// And once again, but this time freeing up memory as we iterate +template +struct sparse_hashtable_destructive_iterator { + public: + typedef sparse_hashtable_destructive_iterator iterator; + typedef typename sparsetable::destructive_iterator st_iterator; + + typedef STL_NAMESPACE::forward_iterator_tag iterator_category; + typedef V value_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef V& reference; // Value + typedef V* pointer; + + // "Real" constructor and default constructor + sparse_hashtable_destructive_iterator(const + sparse_hashtable *h, + st_iterator it, st_iterator it_end) + : ht(h), pos(it), end(it_end) { advance_past_deleted(); } + sparse_hashtable_destructive_iterator() { } // never used internally + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *pos; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic. The only hard part is making sure that + // we're not on a marked-deleted array element + void advance_past_deleted() { + while ( pos != end && ht->test_deleted(*this) ) + ++pos; + } + iterator& operator++() { + assert(pos != end); ++pos; advance_past_deleted(); return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + + // Comparison. + bool operator==(const iterator& it) const { return pos == it.pos; } + bool operator!=(const iterator& it) const { return pos != it.pos; } + + + // The actual data + const sparse_hashtable *ht; + st_iterator pos, end; +}; + + +template +class sparse_hashtable { + public: + typedef Key key_type; + typedef Value value_type; + typedef HashFcn hasher; + typedef EqualKey key_equal; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef sparse_hashtable_iterator + iterator; + + typedef sparse_hashtable_const_iterator + const_iterator; + + typedef sparse_hashtable_destructive_iterator + destructive_iterator; + + // These come from tr1. For us they're the same as regular iterators. + typedef iterator local_iterator; + typedef const_iterator const_local_iterator; + + // How full we let the table get before we resize, by default. + // Knuth says .8 is good -- higher causes us to probe too much, + // though it saves memory. + static const float HT_OCCUPANCY_FLT; // = 0.8f; + + // How empty we let the table get before we resize lower, by default. + // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing + static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT; + + // Minimum size we're willing to let hashtables be. + // Must be a power of two, and at least 4. + // Note, however, that for a given hashtable, the minimum size is + // determined by the first constructor arg, and may be >HT_MIN_BUCKETS. + static const size_t HT_MIN_BUCKETS = 4; + + // By default, if you don't specify a hashtable size at + // construction-time, we use this size. Must be a power of two, and + // at least HT_MIN_BUCKETS. + static const size_t HT_DEFAULT_STARTING_BUCKETS = 32; + + // ITERATOR FUNCTIONS + iterator begin() { return iterator(this, table.nonempty_begin(), + table.nonempty_end()); } + iterator end() { return iterator(this, table.nonempty_end(), + table.nonempty_end()); } + const_iterator begin() const { return const_iterator(this, + table.nonempty_begin(), + table.nonempty_end()); } + const_iterator end() const { return const_iterator(this, + table.nonempty_end(), + table.nonempty_end()); } + + // These come from tr1 unordered_map. They iterate over 'bucket' n. + // For sparsehashtable, we could consider each 'group' to be a bucket, + // I guess, but I don't really see the point. We'll just consider + // bucket n to be the n-th element of the sparsetable, if it's occupied, + // or some empty element, otherwise. + local_iterator begin(size_type i) { + if (table.test(i)) + return local_iterator(this, table.get_iter(i), table.nonempty_end()); + else + return local_iterator(this, table.nonempty_end(), table.nonempty_end()); + } + local_iterator end(size_type i) { + local_iterator it = begin(i); + if (table.test(i) && !test_deleted(i)) + ++it; + return it; + } + const_local_iterator begin(size_type i) const { + if (table.test(i)) + return const_local_iterator(this, table.get_iter(i), + table.nonempty_end()); + else + return const_local_iterator(this, table.nonempty_end(), + table.nonempty_end()); + } + const_local_iterator end(size_type i) const { + const_local_iterator it = begin(i); + if (table.test(i) && !test_deleted(i)) + ++it; + return it; + } + + // This is used when resizing + destructive_iterator destructive_begin() { + return destructive_iterator(this, table.destructive_begin(), + table.destructive_end()); + } + destructive_iterator destructive_end() { + return destructive_iterator(this, table.destructive_end(), + table.destructive_end()); + } + + + // ACCESSOR FUNCTIONS for the things we templatize on, basically + hasher hash_funct() const { return hash; } + key_equal key_eq() const { return equals; } + + // Accessor function for statistics gathering. + int num_table_copies() const { return num_ht_copies; } + + private: + // We need to copy values when we set the special marker for deleted + // elements, but, annoyingly, we can't just use the copy assignment + // operator because value_type might not be assignable (it's often + // pair). We use explicit destructor invocation and + // placement new to get around this. Arg. + void set_value(value_type* dst, const value_type src) { + dst->~value_type(); // delete the old value, if any + new(dst) value_type(src); + } + + // This is used as a tag for the copy constructor, saying to destroy its + // arg We have two ways of destructively copying: with potentially growing + // the hashtable as we copy, and without. To make sure the outside world + // can't do a destructive copy, we make the typename private. + enum MoveDontCopyT {MoveDontCopy, MoveDontGrow}; + + + // DELETE HELPER FUNCTIONS + // This lets the user describe a key that will indicate deleted + // table entries. This key should be an "impossible" entry -- + // if you try to insert it for real, you won't be able to retrieve it! + // (NB: while you pass in an entire value, only the key part is looked + // at. This is just because I don't know how to assign just a key.) + private: + void squash_deleted() { // gets rid of any deleted entries we have + if ( num_deleted ) { // get rid of deleted before writing + sparse_hashtable tmp(MoveDontGrow, *this); + swap(tmp); // now we are tmp + } + assert(num_deleted == 0); + } + + public: + void set_deleted_key(const key_type &key) { + // It's only safe to change what "deleted" means if we purge deleted guys + squash_deleted(); + use_deleted = true; + delkey = key; + } + void clear_deleted_key() { + squash_deleted(); + use_deleted = false; + } + key_type deleted_key() const { + assert(use_deleted); + return delkey; + } + + // These are public so the iterators can use them + // True if the item at position bucknum is "deleted" marker + bool test_deleted(size_type bucknum) const { + // The num_deleted test is crucial for read(): after read(), the ht values + // are garbage, and we don't want to think some of them are deleted. + return (use_deleted && num_deleted > 0 && table.test(bucknum) && + equals(delkey, get_key(table.unsafe_get(bucknum)))); + } + bool test_deleted(const iterator &it) const { + return (use_deleted && num_deleted > 0 && + equals(delkey, get_key(*it))); + } + bool test_deleted(const const_iterator &it) const { + return (use_deleted && num_deleted > 0 && + equals(delkey, get_key(*it))); + } + bool test_deleted(const destructive_iterator &it) const { + return (use_deleted && num_deleted > 0 && + equals(delkey, get_key(*it))); + } + // Set it so test_deleted is true. true if object didn't used to be deleted. + bool set_deleted(iterator &it) { + assert(use_deleted); + bool retval = !test_deleted(it); + // &* converts from iterator to value-type. + set_key(&(*it), delkey); + return retval; + } + // Set it so test_deleted is false. true if object used to be deleted. + bool clear_deleted(iterator &it) { + assert(use_deleted); + // Happens automatically when we assign something else in its place. + return test_deleted(it); + } + + // We also allow to set/clear the deleted bit on a const iterator. + // We allow a const_iterator for the same reason you can delete a + // const pointer: it's convenient, and semantically you can't use + // 'it' after it's been deleted anyway, so its const-ness doesn't + // really matter. + bool set_deleted(const_iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + bool retval = !test_deleted(it); + set_key(const_cast(&(*it)), delkey); + return retval; + } + bool clear_deleted(const_iterator &it) { + assert(use_deleted); // bad if set_deleted_key() wasn't called + return test_deleted(it); + } + + + // FUNCTIONS CONCERNING SIZE + size_type size() const { return table.num_nonempty() - num_deleted; } + // Buckets are always a power of 2 + size_type max_size() const { return (size_type(-1) >> 1U) + 1; } + bool empty() const { return size() == 0; } + size_type bucket_count() const { return table.size(); } + size_type max_bucket_count() const { return max_size(); } + // These are tr1 methods. Their idea of 'bucket' doesn't map well to + // what we do. We just say every bucket has 0 or 1 items in it. + size_type bucket_size(size_type i) const { + return begin(i) == end(i) ? 0 : 1; + } + + + private: + // Because of the above, size_type(-1) is never legal; use it for errors + static const size_type ILLEGAL_BUCKET = size_type(-1); + + private: + // This is the smallest size a hashtable can be without being too crowded + // If you like, you can give a min #buckets as well as a min #elts + size_type min_size(size_type num_elts, size_type min_buckets_wanted) { + size_type sz = HT_MIN_BUCKETS; // min buckets allowed + while ( sz < min_buckets_wanted || + num_elts >= static_cast(sz * enlarge_resize_percent) ) { + if (sz * 2 < sz) + throw std::length_error("resize overflow"); // protect against overflow + sz *= 2; + } + return sz; + } + + // Used after a string of deletes + void maybe_shrink() { + assert(table.num_nonempty() >= num_deleted); + assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two + assert(bucket_count() >= HT_MIN_BUCKETS); + + // If you construct a hashtable with < HT_DEFAULT_STARTING_BUCKETS, + // we'll never shrink until you get relatively big, and we'll never + // shrink below HT_DEFAULT_STARTING_BUCKETS. Otherwise, something + // like "dense_hash_set x; x.insert(4); x.erase(4);" will + // shrink us down to HT_MIN_BUCKETS buckets, which is too small. + if (shrink_threshold > 0 && + (table.num_nonempty()-num_deleted) < shrink_threshold && + bucket_count() > HT_DEFAULT_STARTING_BUCKETS) { + size_type sz = bucket_count() / 2; // find how much we should shrink + while ( sz > HT_DEFAULT_STARTING_BUCKETS && + (table.num_nonempty() - num_deleted) <= sz * + shrink_resize_percent ) + sz /= 2; // stay a power of 2 + sparse_hashtable tmp(MoveDontCopy, *this, sz); + swap(tmp); // now we are tmp + } + consider_shrink = false; // because we just considered it + } + + // We'll let you resize a hashtable -- though this makes us copy all! + // When you resize, you say, "make it big enough for this many more elements" + void resize_delta(size_type delta) { + if ( consider_shrink ) // see if lots of deletes happened + maybe_shrink(); + if ( bucket_count() >= HT_MIN_BUCKETS && + (table.num_nonempty() + delta) <= enlarge_threshold ) + return; // we're ok as we are + + // Sometimes, we need to resize just to get rid of all the + // "deleted" buckets that are clogging up the hashtable. So when + // deciding whether to resize, count the deleted buckets (which + // are currently taking up room). But later, when we decide what + // size to resize to, *don't* count deleted buckets, since they + // get discarded during the resize. + const size_type needed_size = min_size(table.num_nonempty() + delta, 0); + if ( needed_size > bucket_count() ) { // we don't have enough buckets + size_type resize_to = min_size(table.num_nonempty() - num_deleted + delta, + bucket_count()); + if (resize_to < needed_size) { + // This situation means that we have enough deleted elements, + // that once we purge them, we won't actually have needed to + // grow. But we may want to grow anyway: if we just purge one + // element, say, we'll have to grow anyway next time we + // insert. Might as well grow now, since we're already going + // through the trouble of copying (in order to purge the + // deleted elements). + if (table.num_nonempty() - num_deleted + delta >= + static_cast(resize_to*2 * shrink_resize_percent)) { + // Good, we won't be below the shrink threshhold even if we double. + resize_to *= 2; + } + } + + sparse_hashtable tmp(MoveDontCopy, *this, resize_to); + swap(tmp); // now we are tmp + } + } + + // Used to actually do the rehashing when we grow/shrink a hashtable + void copy_from(const sparse_hashtable &ht, size_type min_buckets_wanted) { + clear(); // clear table, set num_deleted to 0 + + // If we need to change the size of our table, do it now + const size_type resize_to = min_size(ht.size(), min_buckets_wanted); + if ( resize_to > bucket_count() ) { // we don't have enough buckets + table.resize(resize_to); // sets the number of buckets + reset_thresholds(); + } + + // We use a normal iterator to get non-deleted bcks from ht + // We could use insert() here, but since we know there are + // no duplicates and no deleted items, we can be more efficient + assert( (bucket_count() & (bucket_count()-1)) == 0); // a power of two + for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) { + size_type num_probes = 0; // how many times we've probed + size_type bucknum; + const size_type bucket_count_minus_one = bucket_count() - 1; + for (bucknum = hash(get_key(*it)) & bucket_count_minus_one; + table.test(bucknum); // not empty + bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) { + ++num_probes; + assert(num_probes < bucket_count()); // or else the hashtable is full + } + table.set(bucknum, *it); // copies the value to here + } + num_ht_copies++; + } + + // Implementation is like copy_from, but it destroys the table of the + // "from" guy by freeing sparsetable memory as we iterate. This is + // useful in resizing, since we're throwing away the "from" guy anyway. + void move_from(MoveDontCopyT mover, sparse_hashtable &ht, + size_type min_buckets_wanted) { + clear(); // clear table, set num_deleted to 0 + + // If we need to change the size of our table, do it now + size_t resize_to; + if ( mover == MoveDontGrow ) + resize_to = ht.bucket_count(); // keep same size as old ht + else // MoveDontCopy + resize_to = min_size(ht.size(), min_buckets_wanted); + if ( resize_to > bucket_count() ) { // we don't have enough buckets + table.resize(resize_to); // sets the number of buckets + reset_thresholds(); + } + + // We use a normal iterator to get non-deleted bcks from ht + // We could use insert() here, but since we know there are + // no duplicates and no deleted items, we can be more efficient + assert( (bucket_count() & (bucket_count()-1)) == 0); // a power of two + // THIS IS THE MAJOR LINE THAT DIFFERS FROM COPY_FROM(): + for ( destructive_iterator it = ht.destructive_begin(); + it != ht.destructive_end(); ++it ) { + size_type num_probes = 0; // how many times we've probed + size_type bucknum; + for ( bucknum = hash(get_key(*it)) & (bucket_count()-1); // h % buck_cnt + table.test(bucknum); // not empty + bucknum = (bucknum + JUMP_(key, num_probes)) & (bucket_count()-1) ) { + ++num_probes; + assert(num_probes < bucket_count()); // or else the hashtable is full + } + table.set(bucknum, *it); // copies the value to here + } + num_ht_copies++; + } + + + // Required by the spec for hashed associative container + public: + // Though the docs say this should be num_buckets, I think it's much + // more useful as num_elements. As a special feature, calling with + // req_elements==0 will cause us to shrink if we can, saving space. + void resize(size_type req_elements) { // resize to this or larger + if ( consider_shrink || req_elements == 0 ) + maybe_shrink(); + if ( req_elements > table.num_nonempty() ) // we only grow + resize_delta(req_elements - table.num_nonempty()); + } + + // Get and change the value of shrink_resize_percent and + // enlarge_resize_percent. The description at the beginning of this + // file explains how to choose the values. Setting the shrink + // parameter to 0.0 ensures that the table never shrinks. + void get_resizing_parameters(float* shrink, float* grow) const { + *shrink = shrink_resize_percent; + *grow = enlarge_resize_percent; + } + void set_resizing_parameters(float shrink, float grow) { + assert(shrink >= 0.0); + assert(grow <= 1.0); + if (shrink > grow/2.0f) + shrink = grow / 2.0f; // otherwise we thrash hashtable size + shrink_resize_percent = shrink; + enlarge_resize_percent = grow; + reset_thresholds(); + } + + // CONSTRUCTORS -- as required by the specs, we take a size, + // but also let you specify a hashfunction, key comparator, + // and key extractor. We also define a copy constructor and =. + // DESTRUCTOR -- the default is fine, surprisingly. + explicit sparse_hashtable(size_type expected_max_items_in_table = 0, + const HashFcn& hf = HashFcn(), + const EqualKey& eql = EqualKey(), + const SetKey& set = SetKey(), + const ExtractKey& ext = ExtractKey()) + : hash(hf), equals(eql), get_key(ext), set_key(set), num_deleted(0), + use_deleted(false), delkey(), enlarge_resize_percent(HT_OCCUPANCY_FLT), + shrink_resize_percent(HT_EMPTY_FLT), + table(expected_max_items_in_table == 0 + ? HT_DEFAULT_STARTING_BUCKETS + : min_size(expected_max_items_in_table, 0)), + num_ht_copies(0) { + reset_thresholds(); + } + + // As a convenience for resize(), we allow an optional second argument + // which lets you make this new hashtable a different size than ht. + // We also provide a mechanism of saying you want to "move" the ht argument + // into us instead of copying. + sparse_hashtable(const sparse_hashtable& ht, + size_type min_buckets_wanted = HT_DEFAULT_STARTING_BUCKETS) + : hash(ht.hash), equals(ht.equals), + get_key(ht.get_key), set_key(ht.set_key), num_deleted(0), + use_deleted(ht.use_deleted), delkey(ht.delkey), + enlarge_resize_percent(ht.enlarge_resize_percent), + shrink_resize_percent(ht.shrink_resize_percent), + table(), num_ht_copies(ht.num_ht_copies) { + reset_thresholds(); + copy_from(ht, min_buckets_wanted); // copy_from() ignores deleted entries + } + sparse_hashtable(MoveDontCopyT mover, sparse_hashtable& ht, + size_type min_buckets_wanted = HT_DEFAULT_STARTING_BUCKETS) + : hash(ht.hash), equals(ht.equals), get_key(ht.get_key), + num_deleted(0), use_deleted(ht.use_deleted), delkey(ht.delkey), + enlarge_resize_percent(ht.enlarge_resize_percent), + shrink_resize_percent(ht.shrink_resize_percent), + table(), num_ht_copies(ht.num_ht_copies) { + reset_thresholds(); + move_from(mover, ht, min_buckets_wanted); // ignores deleted entries + } + + sparse_hashtable& operator= (const sparse_hashtable& ht) { + if (&ht == this) return *this; // don't copy onto ourselves + hash = ht.hash; + equals = ht.equals; + get_key = ht.get_key; + set_key = ht.set_key; + use_deleted = ht.use_deleted; + delkey = ht.delkey; + copy_from(ht, HT_MIN_BUCKETS); // calls clear and sets num_deleted to 0 too + return *this; + } + + // Many STL algorithms use swap instead of copy constructors + void swap(sparse_hashtable& ht) { + STL_NAMESPACE::swap(hash, ht.hash); + STL_NAMESPACE::swap(equals, ht.equals); + STL_NAMESPACE::swap(get_key, ht.get_key); + STL_NAMESPACE::swap(set_key, ht.set_key); + STL_NAMESPACE::swap(num_deleted, ht.num_deleted); + STL_NAMESPACE::swap(use_deleted, ht.use_deleted); + STL_NAMESPACE::swap(enlarge_resize_percent, ht.enlarge_resize_percent); + STL_NAMESPACE::swap(shrink_resize_percent, ht.shrink_resize_percent); + STL_NAMESPACE::swap(delkey, ht.delkey); + table.swap(ht.table); + STL_NAMESPACE::swap(num_ht_copies, ht.num_ht_copies); + reset_thresholds(); + ht.reset_thresholds(); + } + + // It's always nice to be able to clear a table without deallocating it + void clear() { + if (!empty() || (num_deleted != 0)) { + table.clear(); + } + reset_thresholds(); + num_deleted = 0; + } + + + // LOOKUP ROUTINES + private: + // Returns a pair of positions: 1st where the object is, 2nd where + // it would go if you wanted to insert it. 1st is ILLEGAL_BUCKET + // if object is not found; 2nd is ILLEGAL_BUCKET if it is. + // Note: because of deletions where-to-insert is not trivial: it's the + // first deleted bucket we see, as long as we don't find the key later + pair find_position(const key_type &key) const { + size_type num_probes = 0; // how many times we've probed + const size_type bucket_count_minus_one = bucket_count() - 1; + size_type bucknum = hash(key) & bucket_count_minus_one; + size_type insert_pos = ILLEGAL_BUCKET; // where we would insert + SPARSEHASH_STAT_UPDATE(total_lookups += 1); + while ( 1 ) { // probe until something happens + if ( !table.test(bucknum) ) { // bucket is empty + SPARSEHASH_STAT_UPDATE(total_probes += num_probes); + if ( insert_pos == ILLEGAL_BUCKET ) // found no prior place to insert + return pair(ILLEGAL_BUCKET, bucknum); + else + return pair(ILLEGAL_BUCKET, insert_pos); + + } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert + if ( insert_pos == ILLEGAL_BUCKET ) + insert_pos = bucknum; + + } else if ( equals(key, get_key(table.unsafe_get(bucknum))) ) { + SPARSEHASH_STAT_UPDATE(total_probes += num_probes); + return pair(bucknum, ILLEGAL_BUCKET); + } + ++num_probes; // we're doing another probe + bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one; + assert(num_probes < bucket_count()); // don't probe too many times! + } + } + + public: + iterator find(const key_type& key) { + if ( size() == 0 ) return end(); + pair pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) // alas, not there + return end(); + else + return iterator(this, table.get_iter(pos.first), table.nonempty_end()); + } + + const_iterator find(const key_type& key) const { + if ( size() == 0 ) return end(); + pair pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) // alas, not there + return end(); + else + return const_iterator(this, + table.get_iter(pos.first), table.nonempty_end()); + } + + // This is a tr1 method: the bucket a given key is in, or what bucket + // it would be put in, if it were to be inserted. Shrug. + size_type bucket(const key_type& key) const { + pair pos = find_position(key); + return pos.first == ILLEGAL_BUCKET ? pos.second : pos.first; + } + + // Counts how many elements have key key. For maps, it's either 0 or 1. + size_type count(const key_type &key) const { + pair pos = find_position(key); + return pos.first == ILLEGAL_BUCKET ? 0 : 1; + } + + // Likewise, equal_range doesn't really make sense for us. Oh well. + pair equal_range(const key_type& key) { + iterator pos = find(key); // either an iterator or end + if (pos == end()) { + return pair(pos, pos); + } else { + const iterator startpos = pos++; + return pair(startpos, pos); + } + } + pair equal_range(const key_type& key) const { + const_iterator pos = find(key); // either an iterator or end + if (pos == end()) { + return pair(pos, pos); + } else { + const const_iterator startpos = pos++; + return pair(startpos, pos); + } + } + + + // INSERTION ROUTINES + private: + // If you know *this is big enough to hold obj, use this routine + pair insert_noresize(const value_type& obj) { + // First, double-check we're not inserting delkey + assert(!use_deleted || !equals(get_key(obj), delkey)); + const pair pos = find_position(get_key(obj)); + if ( pos.first != ILLEGAL_BUCKET) { // object was already there + return pair(iterator(this, table.get_iter(pos.first), + table.nonempty_end()), + false); // false: we didn't insert + } else { // pos.second says where to put it + if ( test_deleted(pos.second) ) { // just replace if it's been del. + // The set() below will undelete this object. We just worry about stats + assert(num_deleted > 0); + --num_deleted; // used to be, now it isn't + } + table.set(pos.second, obj); + return pair(iterator(this, table.get_iter(pos.second), + table.nonempty_end()), + true); // true: we did insert + } + } + + public: + // This is the normal insert routine, used by the outside world + pair insert(const value_type& obj) { + resize_delta(1); // adding an object, grow if need be + return insert_noresize(obj); + } + + // When inserting a lot at a time, we specialize on the type of iterator + template + void insert(InputIterator f, InputIterator l) { + // specializes on iterator type + insert(f, l, typename STL_NAMESPACE::iterator_traits::iterator_category()); + } + + // Iterator supports operator-, resize before inserting + template + void insert(ForwardIterator f, ForwardIterator l, + STL_NAMESPACE::forward_iterator_tag) { + size_type n = STL_NAMESPACE::distance(f, l); // TODO(csilvers): standard? + resize_delta(n); + for ( ; n > 0; --n, ++f) + insert_noresize(*f); + } + + // Arbitrary iterator, can't tell how much to resize + template + void insert(InputIterator f, InputIterator l, + STL_NAMESPACE::input_iterator_tag) { + for ( ; f != l; ++f) + insert(*f); + } + + + // DELETION ROUTINES + size_type erase(const key_type& key) { + // First, double-check we're not erasing delkey. + assert(!use_deleted || !equals(key, delkey)); + const_iterator pos = find(key); // shrug: shouldn't need to be const + if ( pos != end() ) { + assert(!test_deleted(pos)); // or find() shouldn't have returned it + set_deleted(pos); + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + return 1; // because we deleted one thing + } else { + return 0; // because we deleted nothing + } + } + + // We return the iterator past the deleted item. + void erase(iterator pos) { + if ( pos == end() ) return; // sanity check + if ( set_deleted(pos) ) { // true if object has been newly deleted + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + } + } + + void erase(iterator f, iterator l) { + for ( ; f != l; ++f) { + if ( set_deleted(f) ) // should always be true + ++num_deleted; + } + consider_shrink = true; // will think about shrink after next insert + } + + // We allow you to erase a const_iterator just like we allow you to + // erase an iterator. This is in parallel to 'delete': you can delete + // a const pointer just like a non-const pointer. The logic is that + // you can't use the object after it's erased anyway, so it doesn't matter + // if it's const or not. + void erase(const_iterator pos) { + if ( pos == end() ) return; // sanity check + if ( set_deleted(pos) ) { // true if object has been newly deleted + ++num_deleted; + consider_shrink = true; // will think about shrink after next insert + } + } + void erase(const_iterator f, const_iterator l) { + for ( ; f != l; ++f) { + if ( set_deleted(f) ) // should always be true + ++num_deleted; + } + consider_shrink = true; // will think about shrink after next insert + } + + + // COMPARISON + bool operator==(const sparse_hashtable& ht) const { + // We really want to check that the hash functions are the same + // but alas there's no way to do this. We just hope. + return ( num_deleted == ht.num_deleted && table == ht.table ); + } + bool operator!=(const sparse_hashtable& ht) const { + return !(*this == ht); + } + + + // I/O + // We support reading and writing hashtables to disk. NOTE that + // this only stores the hashtable metadata, not the stuff you've + // actually put in the hashtable! Alas, since I don't know how to + // write a hasher or key_equal, you have to make sure everything + // but the table is the same. We compact before writing. + bool write_metadata(FILE *fp) { + squash_deleted(); // so we don't have to worry about delkey + return table.write_metadata(fp); + } + + bool read_metadata(FILE *fp) { + num_deleted = 0; // since we got rid before writing + bool result = table.read_metadata(fp); + reset_thresholds(); + return result; + } + + // Only meaningful if value_type is a POD. + bool write_nopointer_data(FILE *fp) { + return table.write_nopointer_data(fp); + } + + // Only meaningful if value_type is a POD. + bool read_nopointer_data(FILE *fp) { + return table.read_nopointer_data(fp); + } + + private: + // The actual data + hasher hash; // required by hashed_associative_container + key_equal equals; + ExtractKey get_key; + SetKey set_key; + size_type num_deleted; // how many occupied buckets are marked deleted + bool use_deleted; // false until delkey has been set + // TODO(csilvers): make a pointer, and get rid of use_deleted (benchmark!) + key_type delkey; // which key marks deleted entries + float enlarge_resize_percent; // how full before resize + float shrink_resize_percent; // how empty before resize + size_type shrink_threshold; // table.size() * shrink_resize_percent + size_type enlarge_threshold; // table.size() * enlarge_resize_percent + sparsetable table; // holds num_buckets and num_elements too + bool consider_shrink; // true if we should try to shrink before next insert + int num_ht_copies; // a statistics counter incremented every Copy/Move + + void reset_thresholds() { + enlarge_threshold = static_cast(table.size() + * enlarge_resize_percent); + shrink_threshold = static_cast(table.size() + * shrink_resize_percent); + consider_shrink = false; // whatever caused us to reset already considered + } +}; + +// We need a global swap as well +template +inline void swap(sparse_hashtable &x, + sparse_hashtable &y) { + x.swap(y); +} + +#undef JUMP_ + +template +const typename sparse_hashtable::size_type + sparse_hashtable::ILLEGAL_BUCKET; + +// How full we let the table get before we resize. Knuth says .8 is +// good -- higher causes us to probe too much, though saves memory +template +const float sparse_hashtable::HT_OCCUPANCY_FLT = 0.8f; + +// How empty we let the table get before we resize lower. +// It should be less than OCCUPANCY_FLT / 2 or we thrash resizing +template +const float sparse_hashtable::HT_EMPTY_FLT = 0.4f * +sparse_hashtable::HT_OCCUPANCY_FLT; + +_END_GOOGLE_NAMESPACE_ + +#endif /* _SPARSEHASHTABLE_H_ */ diff --git a/src/sparsehash-1.6/src/google/sparsetable b/src/sparsehash-1.6/src/google/sparsetable new file mode 100644 index 0000000..6dc0937 --- /dev/null +++ b/src/sparsehash-1.6/src/google/sparsetable @@ -0,0 +1,1473 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// A sparsetable is a random container that implements a sparse array, +// that is, an array that uses very little memory to store unassigned +// indices (in this case, between 1-2 bits per unassigned index). For +// instance, if you allocate an array of size 5 and assign a[2] = , then a[2] will take up a lot of memory but a[0], a[1], +// a[3], and a[4] will not. Array elements that have a value are +// called "assigned". Array elements that have no value yet, or have +// had their value cleared using erase() or clear(), are called +// "unassigned". +// +// Unassigned values seem to have the default value of T (see below). +// Nevertheless, there is a difference between an unassigned index and +// one explicitly assigned the value of T(). The latter is considered +// assigned. +// +// Access to an array element is constant time, as is insertion and +// deletion. Insertion and deletion may be fairly slow, however: +// because of this container's memory economy, each insert and delete +// causes a memory reallocation. +// +// See /usr/(local/)?doc/sparsehash-0.1/sparsetable.html +// for information about how to use this class. + +#ifndef _SPARSETABLE_H_ +#define _SPARSETABLE_H_ + +#include +#include // for malloc/free +#include // to read/write tables +#ifdef HAVE_STDINT_H +#include // the normal place uint16_t is defined +#endif +#ifdef HAVE_SYS_TYPES_H +#include // the normal place u_int16_t is defined +#endif +#ifdef HAVE_INTTYPES_H +#include // a third place for uint16_t or u_int16_t +#endif +#include // for bounds checking +#include // to define reverse_iterator for me +#include // equal, lexicographical_compare, swap,... +#include // uninitialized_copy +#include // a sparsetable is a vector of groups +#include // for true_type, integral_constant, etc. + +#if STDC_HEADERS +#include // for memcpy +#else +#if !HAVE_MEMCPY +#define memcpy(d, s, n) bcopy ((s), (d), (n)) +#endif +#endif + +_START_GOOGLE_NAMESPACE_ + +#ifndef HAVE_U_INT16_T +# if defined HAVE_UINT16_T + typedef uint16_t u_int16_t; // true on solaris, possibly other C99 libc's +# elif defined HAVE___UINT16 + typedef __int16 int16_t; // true on vc++7 + typedef unsigned __int16 u_int16_t; +# else + // Cannot find a 16-bit integer type. Hoping for the best with "short"... + typedef short int int16_t; + typedef unsigned short int u_int16_t; +# endif +#endif + +using STL_NAMESPACE::vector; +using STL_NAMESPACE::uninitialized_copy; + +// The smaller this is, the faster lookup is (because the group bitmap is +// smaller) and the faster insert is, because there's less to move. +// On the other hand, there are more groups. Since group::size_type is +// a short, this number should be of the form 32*x + 16 to avoid waste. +static const u_int16_t DEFAULT_SPARSEGROUP_SIZE = 48; // fits in 1.5 words + + +// A NOTE ON ASSIGNING: +// A sparse table does not actually allocate memory for entries +// that are not filled. Because of this, it becomes complicated +// to have a non-const iterator: we don't know, if the iterator points +// to a not-filled bucket, whether you plan to fill it with something +// or whether you plan to read its value (in which case you'll get +// the default bucket value). Therefore, while we can define const +// operations in a pretty 'normal' way, for non-const operations, we +// define something that returns a helper object with operator= and +// operator& that allocate a bucket lazily. We use this for table[] +// and also for regular table iterators. + +template +class table_element_adaptor { + public: + typedef typename tabletype::value_type value_type; + typedef typename tabletype::size_type size_type; + typedef typename tabletype::reference reference; + typedef typename tabletype::pointer pointer; + + table_element_adaptor(tabletype *tbl, size_type p) + : table(tbl), pos(p) { } + table_element_adaptor& operator= (const value_type &val) { + table->set(pos, val); + return *this; + } + operator value_type() { return table->get(pos); } // we look like a value + pointer operator& () { return &table->mutating_get(pos); } + + private: + tabletype* table; + size_type pos; +}; + +// Our iterator as simple as iterators can be: basically it's just +// the index into our table. Dereference, the only complicated +// thing, we punt to the table class. This just goes to show how +// much machinery STL requires to do even the most trivial tasks. +// +// By templatizing over tabletype, we have one iterator type which +// we can use for both sparsetables and sparsebins. In fact it +// works on any class that allows size() and operator[] (eg vector), +// as long as it does the standard STL typedefs too (eg value_type). + +template +class table_iterator { + public: + typedef table_iterator iterator; + + typedef STL_NAMESPACE::random_access_iterator_tag iterator_category; + typedef typename tabletype::value_type value_type; + typedef typename tabletype::difference_type difference_type; + typedef typename tabletype::size_type size_type; + typedef table_element_adaptor reference; + typedef table_element_adaptor* pointer; + + // The "real" constructor + table_iterator(tabletype *tbl, size_type p) + : table(tbl), pos(p) { } + // The default constructor, used when I define vars of type table::iterator + table_iterator() : table(NULL), pos(0) { } + // The copy constructor, for when I say table::iterator foo = tbl.begin() + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // The main thing our iterator does is dereference. If the table entry + // we point to is empty, we return the default value type. + // This is the big different function from the const iterator. + reference operator*() { + return table_element_adaptor(table, pos); + } + pointer operator->() { return &(operator*()); } + + // Helper function to assert things are ok; eg pos is still in range + void check() const { + assert(table); + assert(pos <= table->size()); + } + + // Arithmetic: we just do arithmetic on pos. We don't even need to + // do bounds checking, since STL doesn't consider that it's job. :-) + iterator& operator+=(size_type t) { pos += t; check(); return *this; } + iterator& operator-=(size_type t) { pos -= t; check(); return *this; } + iterator& operator++() { ++pos; check(); return *this; } + iterator& operator--() { --pos; check(); return *this; } + iterator operator++(int) { iterator tmp(*this); // for x++ + ++pos; check(); return tmp; } + iterator operator--(int) { iterator tmp(*this); // for x-- + --pos; check(); return tmp; } + iterator operator+(difference_type i) const { iterator tmp(*this); + tmp += i; return tmp; } + iterator operator-(difference_type i) const { iterator tmp(*this); + tmp -= i; return tmp; } + difference_type operator-(iterator it) const { // for "x = it2 - it" + assert(table == it.table); + return pos - it.pos; + } + reference operator[](difference_type n) const { + return *(*this + n); // simple though not totally efficient + } + + // Comparisons. + bool operator==(const iterator& it) const { + return table == it.table && pos == it.pos; + } + bool operator<(const iterator& it) const { + assert(table == it.table); // life is bad bad bad otherwise + return pos < it.pos; + } + bool operator!=(const iterator& it) const { return !(*this == it); } + bool operator<=(const iterator& it) const { return !(it < *this); } + bool operator>(const iterator& it) const { return it < *this; } + bool operator>=(const iterator& it) const { return !(*this < it); } + + // Here's the info we actually need to be an iterator + tabletype *table; // so we can dereference and bounds-check + size_type pos; // index into the table +}; + +// support for "3 + iterator" has to be defined outside the class, alas +template +table_iterator operator+(typename table_iterator::difference_type i, + table_iterator it) { + return it + i; // so people can say it2 = 3 + it +} + +template +class const_table_iterator { + public: + typedef table_iterator iterator; + typedef const_table_iterator const_iterator; + + typedef STL_NAMESPACE::random_access_iterator_tag iterator_category; + typedef typename tabletype::value_type value_type; + typedef typename tabletype::difference_type difference_type; + typedef typename tabletype::size_type size_type; + typedef typename tabletype::const_reference reference; // we're const-only + typedef typename tabletype::const_pointer pointer; + + // The "real" constructor + const_table_iterator(const tabletype *tbl, size_type p) + : table(tbl), pos(p) { } + // The default constructor, used when I define vars of type table::iterator + const_table_iterator() : table(NULL), pos(0) { } + // The copy constructor, for when I say table::iterator foo = tbl.begin() + // Also converts normal iterators to const iterators + const_table_iterator(const iterator &from) + : table(from.table), pos(from.pos) { } + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // The main thing our iterator does is dereference. If the table entry + // we point to is empty, we return the default value type. + reference operator*() const { return (*table)[pos]; } + pointer operator->() const { return &(operator*()); } + + // Helper function to assert things are ok; eg pos is still in range + void check() const { + assert(table); + assert(pos <= table->size()); + } + + // Arithmetic: we just do arithmetic on pos. We don't even need to + // do bounds checking, since STL doesn't consider that it's job. :-) + const_iterator& operator+=(size_type t) { pos += t; check(); return *this; } + const_iterator& operator-=(size_type t) { pos -= t; check(); return *this; } + const_iterator& operator++() { ++pos; check(); return *this; } + const_iterator& operator--() { --pos; check(); return *this; } + const_iterator operator++(int) { const_iterator tmp(*this); // for x++ + ++pos; check(); return tmp; } + const_iterator operator--(int) { const_iterator tmp(*this); // for x-- + --pos; check(); return tmp; } + const_iterator operator+(difference_type i) const { const_iterator tmp(*this); + tmp += i; return tmp; } + const_iterator operator-(difference_type i) const { const_iterator tmp(*this); + tmp -= i; return tmp; } + difference_type operator-(const_iterator it) const { // for "x = it2 - it" + assert(table == it.table); + return pos - it.pos; + } + reference operator[](difference_type n) const { + return *(*this + n); // simple though not totally efficient + } + + // Comparisons. + bool operator==(const const_iterator& it) const { + return table == it.table && pos == it.pos; + } + bool operator<(const const_iterator& it) const { + assert(table == it.table); // life is bad bad bad otherwise + return pos < it.pos; + } + bool operator!=(const const_iterator& it) const { return !(*this == it); } + bool operator<=(const const_iterator& it) const { return !(it < *this); } + bool operator>(const const_iterator& it) const { return it < *this; } + bool operator>=(const const_iterator& it) const { return !(*this < it); } + + // Here's the info we actually need to be an iterator + const tabletype *table; // so we can dereference and bounds-check + size_type pos; // index into the table +}; + +// support for "3 + iterator" has to be defined outside the class, alas +template +const_table_iterator operator+(typename + const_table_iterator::difference_type i, + const_table_iterator it) { + return it + i; // so people can say it2 = 3 + it +} + + +// --------------------------------------------------------------------------- + + +/* +// This is a 2-D iterator. You specify a begin and end over a list +// of *containers*. We iterate over each container by iterating over +// it. It's actually simple: +// VECTOR.begin() VECTOR[0].begin() --------> VECTOR[0].end() ---, +// | ________________________________________________/ +// | \_> VECTOR[1].begin() --------> VECTOR[1].end() -, +// | ___________________________________________________/ +// v \_> ...... +// VECTOR.end() +// +// It's impossible to do random access on one of these things in constant +// time, so it's just a bidirectional iterator. +// +// Unfortunately, because we need to use this for a non-empty iterator, +// we use nonempty_begin() and nonempty_end() instead of begin() and end() +// (though only going across, not down). +*/ + +#define TWOD_BEGIN_ nonempty_begin +#define TWOD_END_ nonempty_end +#define TWOD_ITER_ nonempty_iterator +#define TWOD_CONST_ITER_ const_nonempty_iterator + +template +class two_d_iterator { + public: + typedef two_d_iterator iterator; + + typedef STL_NAMESPACE::bidirectional_iterator_tag iterator_category; + // apparently some versions of VC++ have trouble with two ::'s in a typename + typedef typename containertype::value_type _tmp_vt; + typedef typename _tmp_vt::value_type value_type; + typedef typename _tmp_vt::difference_type difference_type; + typedef typename _tmp_vt::reference reference; + typedef typename _tmp_vt::pointer pointer; + + // The "real" constructor. begin and end specify how many rows we have + // (in the diagram above); we always iterate over each row completely. + two_d_iterator(typename containertype::iterator begin, + typename containertype::iterator end, + typename containertype::iterator curr) + : row_begin(begin), row_end(end), row_current(curr), col_current() { + if ( row_current != row_end ) { + col_current = row_current->TWOD_BEGIN_(); + advance_past_end(); // in case cur->begin() == cur->end() + } + } + // If you want to start at an arbitrary place, you can, I guess + two_d_iterator(typename containertype::iterator begin, + typename containertype::iterator end, + typename containertype::iterator curr, + typename containertype::value_type::TWOD_ITER_ col) + : row_begin(begin), row_end(end), row_current(curr), col_current(col) { + advance_past_end(); // in case cur->begin() == cur->end() + } + // The default constructor, used when I define vars of type table::iterator + two_d_iterator() : row_begin(), row_end(), row_current(), col_current() { } + // The default destructor is fine; we don't define one + // The default operator= is fine; we don't define one + + // Happy dereferencer + reference operator*() const { return *col_current; } + pointer operator->() const { return &(operator*()); } + + // Arithmetic: we just do arithmetic on pos. We don't even need to + // do bounds checking, since STL doesn't consider that it's job. :-) + // NOTE: this is not amortized constant time! What do we do about it? + void advance_past_end() { // used when col_current points to end() + while ( col_current == row_current->TWOD_END_() ) { // end of current row + ++row_current; // go to beginning of next + if ( row_current != row_end ) // col is irrelevant at end + col_current = row_current->TWOD_BEGIN_(); + else + break; // don't go past row_end + } + } + + iterator& operator++() { + assert(row_current != row_end); // how to ++ from there? + ++col_current; + advance_past_end(); // in case col_current is at end() + return *this; + } + iterator& operator--() { + while ( row_current == row_end || + col_current == row_current->TWOD_BEGIN_() ) { + assert(row_current != row_begin); + --row_current; + col_current = row_current->TWOD_END_(); // this is 1 too far + } + --col_current; + return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + iterator operator--(int) { iterator tmp(*this); --*this; return tmp; } + + + // Comparisons. + bool operator==(const iterator& it) const { + return ( row_begin == it.row_begin && + row_end == it.row_end && + row_current == it.row_current && + (row_current == row_end || col_current == it.col_current) ); + } + bool operator!=(const iterator& it) const { return !(*this == it); } + + + // Here's the info we actually need to be an iterator + // These need to be public so we convert from iterator to const_iterator + typename containertype::iterator row_begin, row_end, row_current; + typename containertype::value_type::TWOD_ITER_ col_current; +}; + +// The same thing again, but this time const. :-( +template +class const_two_d_iterator { + public: + typedef const_two_d_iterator iterator; + + typedef STL_NAMESPACE::bidirectional_iterator_tag iterator_category; + // apparently some versions of VC++ have trouble with two ::'s in a typename + typedef typename containertype::value_type _tmp_vt; + typedef typename _tmp_vt::value_type value_type; + typedef typename _tmp_vt::difference_type difference_type; + typedef typename _tmp_vt::const_reference reference; + typedef typename _tmp_vt::const_pointer pointer; + + const_two_d_iterator(typename containertype::const_iterator begin, + typename containertype::const_iterator end, + typename containertype::const_iterator curr) + : row_begin(begin), row_end(end), row_current(curr), col_current() { + if ( curr != end ) { + col_current = curr->TWOD_BEGIN_(); + advance_past_end(); // in case cur->begin() == cur->end() + } + } + const_two_d_iterator(typename containertype::const_iterator begin, + typename containertype::const_iterator end, + typename containertype::const_iterator curr, + typename containertype::value_type::TWOD_CONST_ITER_ col) + : row_begin(begin), row_end(end), row_current(curr), col_current(col) { + advance_past_end(); // in case cur->begin() == cur->end() + } + const_two_d_iterator() + : row_begin(), row_end(), row_current(), col_current() { + } + // Need this explicitly so we can convert normal iterators to const iterators + const_two_d_iterator(const two_d_iterator& it) : + row_begin(it.row_begin), row_end(it.row_end), row_current(it.row_current), + col_current(it.col_current) { } + + typename containertype::const_iterator row_begin, row_end, row_current; + typename containertype::value_type::TWOD_CONST_ITER_ col_current; + + + // EVERYTHING FROM HERE DOWN IS THE SAME AS THE NON-CONST ITERATOR + reference operator*() const { return *col_current; } + pointer operator->() const { return &(operator*()); } + + void advance_past_end() { // used when col_current points to end() + while ( col_current == row_current->TWOD_END_() ) { // end of current row + ++row_current; // go to beginning of next + if ( row_current != row_end ) // col is irrelevant at end + col_current = row_current->TWOD_BEGIN_(); + else + break; // don't go past row_end + } + } + iterator& operator++() { + assert(row_current != row_end); // how to ++ from there? + ++col_current; + advance_past_end(); // in case col_current is at end() + return *this; + } + iterator& operator--() { + while ( row_current == row_end || + col_current == row_current->TWOD_BEGIN_() ) { + assert(row_current != row_begin); + --row_current; + col_current = row_current->TWOD_END_(); // this is 1 too far + } + --col_current; + return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + iterator operator--(int) { iterator tmp(*this); --*this; return tmp; } + + bool operator==(const iterator& it) const { + return ( row_begin == it.row_begin && + row_end == it.row_end && + row_current == it.row_current && + (row_current == row_end || col_current == it.col_current) ); + } + bool operator!=(const iterator& it) const { return !(*this == it); } +}; + +// We provide yet another version, to be as frugal with memory as +// possible. This one frees each block of memory as it finishes +// iterating over it. By the end, the entire table is freed. +// For understandable reasons, you can only iterate over it once, +// which is why it's an input iterator +template +class destructive_two_d_iterator { + public: + typedef destructive_two_d_iterator iterator; + + typedef STL_NAMESPACE::input_iterator_tag iterator_category; + // apparently some versions of VC++ have trouble with two ::'s in a typename + typedef typename containertype::value_type _tmp_vt; + typedef typename _tmp_vt::value_type value_type; + typedef typename _tmp_vt::difference_type difference_type; + typedef typename _tmp_vt::reference reference; + typedef typename _tmp_vt::pointer pointer; + + destructive_two_d_iterator(typename containertype::iterator begin, + typename containertype::iterator end, + typename containertype::iterator curr) + : row_begin(begin), row_end(end), row_current(curr), col_current() { + if ( curr != end ) { + col_current = curr->TWOD_BEGIN_(); + advance_past_end(); // in case cur->begin() == cur->end() + } + } + destructive_two_d_iterator(typename containertype::iterator begin, + typename containertype::iterator end, + typename containertype::iterator curr, + typename containertype::value_type::TWOD_ITER_ col) + : row_begin(begin), row_end(end), row_current(curr), col_current(col) { + advance_past_end(); // in case cur->begin() == cur->end() + } + destructive_two_d_iterator() + : row_begin(), row_end(), row_current(), col_current() { + } + + typename containertype::iterator row_begin, row_end, row_current; + typename containertype::value_type::TWOD_ITER_ col_current; + + // This is the part that destroys + void advance_past_end() { // used when col_current points to end() + while ( col_current == row_current->TWOD_END_() ) { // end of current row + row_current->clear(); // the destructive part + // It would be nice if we could decrement sparsetable->num_buckets here + ++row_current; // go to beginning of next + if ( row_current != row_end ) // col is irrelevant at end + col_current = row_current->TWOD_BEGIN_(); + else + break; // don't go past row_end + } + } + + // EVERYTHING FROM HERE DOWN IS THE SAME AS THE REGULAR ITERATOR + reference operator*() const { return *col_current; } + pointer operator->() const { return &(operator*()); } + + iterator& operator++() { + assert(row_current != row_end); // how to ++ from there? + ++col_current; + advance_past_end(); // in case col_current is at end() + return *this; + } + iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } + + bool operator==(const iterator& it) const { + return ( row_begin == it.row_begin && + row_end == it.row_end && + row_current == it.row_current && + (row_current == row_end || col_current == it.col_current) ); + } + bool operator!=(const iterator& it) const { return !(*this == it); } +}; + +#undef TWOD_BEGIN_ +#undef TWOD_END_ +#undef TWOD_ITER_ +#undef TWOD_CONST_ITER_ + + + + +// SPARSE-TABLE +// ------------ +// The idea is that a table with (logically) t buckets is divided +// into t/M *groups* of M buckets each. (M is a constant set in +// GROUP_SIZE for efficiency.) Each group is stored sparsely. +// Thus, inserting into the table causes some array to grow, which is +// slow but still constant time. Lookup involves doing a +// logical-position-to-sparse-position lookup, which is also slow but +// constant time. The larger M is, the slower these operations are +// but the less overhead (slightly). +// +// To store the sparse array, we store a bitmap B, where B[i] = 1 iff +// bucket i is non-empty. Then to look up bucket i we really look up +// array[# of 1s before i in B]. This is constant time for fixed M. +// +// Terminology: the position of an item in the overall table (from +// 1 .. t) is called its "location." The logical position in a group +// (from 1 .. M ) is called its "position." The actual location in +// the array (from 1 .. # of non-empty buckets in the group) is +// called its "offset." + +// The weird mod in the offset is entirely to quiet compiler warnings +// as is the cast to int after doing the "x mod 256" +#define PUT_(take_from, offset) do { \ + if (putc(static_cast(((take_from) >> ((offset) % (sizeof(take_from)*8)))\ + % 256), fp) \ + == EOF) \ + return false; \ +} while (0) + +#define GET_(add_to, offset) do { \ + if ((x=getc(fp)) == EOF) \ + return false; \ + else \ + add_to |= (static_cast(x) << ((offset) % (sizeof(add_to)*8))); \ +} while (0) + +template +class sparsegroup { + public: + // Basic types + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef table_iterator > iterator; + typedef const_table_iterator > const_iterator; + typedef table_element_adaptor > element_adaptor; + typedef value_type &reference; + typedef const value_type &const_reference; + typedef u_int16_t size_type; // max # of buckets + typedef int16_t difference_type; + typedef STL_NAMESPACE::reverse_iterator const_reverse_iterator; + typedef STL_NAMESPACE::reverse_iterator reverse_iterator; + + // These are our special iterators, that go over non-empty buckets in a + // group. These aren't const-only because you can change non-empty bcks. + typedef pointer nonempty_iterator; + typedef const_pointer const_nonempty_iterator; + typedef STL_NAMESPACE::reverse_iterator reverse_nonempty_iterator; + typedef STL_NAMESPACE::reverse_iterator const_reverse_nonempty_iterator; + + // Iterator functions + iterator begin() { return iterator(this, 0); } + const_iterator begin() const { return const_iterator(this, 0); } + iterator end() { return iterator(this, size()); } + const_iterator end() const { return const_iterator(this, size()); } + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + // We'll have versions for our special non-empty iterator too + nonempty_iterator nonempty_begin() { return group; } + const_nonempty_iterator nonempty_begin() const { return group; } + nonempty_iterator nonempty_end() { return group + num_buckets; } + const_nonempty_iterator nonempty_end() const { return group + num_buckets; } + reverse_nonempty_iterator nonempty_rbegin() { + return reverse_nonempty_iterator(nonempty_end()); + } + const_reverse_nonempty_iterator nonempty_rbegin() const { + return const_reverse_nonempty_iterator(nonempty_end()); + } + reverse_nonempty_iterator nonempty_rend() { + return reverse_nonempty_iterator(nonempty_begin()); + } + const_reverse_nonempty_iterator nonempty_rend() const { + return const_reverse_nonempty_iterator(nonempty_begin()); + } + + + // This gives us the "default" value to return for an empty bucket. + // We just use the default constructor on T, the template type + const_reference default_value() const { + static value_type defaultval = value_type(); + return defaultval; + } + + + private: + // We need to do all this bit manipulation, of course. ick + static size_type charbit(size_type i) { return i >> 3; } + static size_type modbit(size_type i) { return 1 << (i&7); } + int bmtest(size_type i) const { return bitmap[charbit(i)] & modbit(i); } + void bmset(size_type i) { bitmap[charbit(i)] |= modbit(i); } + void bmclear(size_type i) { bitmap[charbit(i)] &= ~modbit(i); } + + void* realloc_or_die(void* ptr, size_t num_bytes) { + void* retval = realloc(ptr, num_bytes); + if (retval == NULL) { + // We really should use PRIuS here, but I don't want to have to add + // a whole new configure option, with concomitant macro namespace + // pollution, just to print this (unlikely) error message. So I cast. + fprintf(stderr, "FATAL ERROR: failed to allocate %lu bytes for ptr %p", + static_cast(num_bytes), ptr); + exit(1); + } + return retval; + } + + value_type* allocate_group(size_t n) { + return static_cast(realloc_or_die(NULL, + n * sizeof(value_type))); + } + + void free_group() { + // Valid even for empty group, because NULL+0 is defined to be NULL + value_type* end_it = group + num_buckets; + for (value_type* p = group; p != end_it; ++p) + p->~value_type(); + free(group); + group = NULL; + } + + public: // get_iter() in sparsetable needs it + // We need a small function that tells us how many set bits there are + // in positions 0..i-1 of the bitmap. It uses a big table. + // We make it static so templates don't allocate lots of these tables. + // There are lots of ways to do this calculation (called 'popcount'). + // The 8-bit table lookup is one of the fastest, though this + // implementation suffers from not doing any loop unrolling. See, eg, + // http://www.dalkescientific.com/writings/diary/archive/2008/07/03/hakmem_and_other_popcounts.html + // http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ + static size_type pos_to_offset(const unsigned char *bm, size_type pos) { + // We could make these ints. The tradeoff is size (eg does it overwhelm + // the cache?) vs efficiency in referencing sub-word-sized array elements + static const char bits_in[256] = { // # of bits set in one char + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, + }; + size_type retval = 0; + + // [Note: condition pos > 8 is an optimization; convince yourself we + // give exactly the same result as if we had pos >= 8 here instead.] + for ( ; pos > 8; pos -= 8 ) // bm[0..pos/8-1] + retval += bits_in[*bm++]; // chars we want *all* bits in + return retval + bits_in[*bm & ((1 << pos)-1)]; // the char that includes pos + } + + size_type pos_to_offset(size_type pos) const { // not static but still const + return pos_to_offset(bitmap, pos); + } + + + public: + // Constructors -- default and copy -- and destructor + sparsegroup() : group(0), num_buckets(0) { memset(bitmap, 0, sizeof(bitmap)); } + sparsegroup(const sparsegroup& x) : group(0), num_buckets(x.num_buckets) { + if ( num_buckets ) { + group = allocate_group(x.num_buckets); + uninitialized_copy(x.group, x.group + x.num_buckets, group); + } + memcpy(bitmap, x.bitmap, sizeof(bitmap)); + } + ~sparsegroup() { free_group(); } + + // Operator= is just like the copy constructor, I guess + // TODO(austern): Make this exception safe. Handle exceptions in value_type's + // copy constructor. + sparsegroup &operator=(const sparsegroup& x) { + if ( &x == this ) return *this; // x = x + if ( x.num_buckets == 0 ) { + free_group(); + } else { + value_type* p = allocate_group(x.num_buckets); + uninitialized_copy(x.group, x.group + x.num_buckets, p); + free_group(); + group = p; + } + memcpy(bitmap, x.bitmap, sizeof(bitmap)); + num_buckets = x.num_buckets; + return *this; + } + + // Many STL algorithms use swap instead of copy constructors + void swap(sparsegroup& x) { + STL_NAMESPACE::swap(group, x.group); + for ( int i = 0; i < sizeof(bitmap) / sizeof(*bitmap); ++i ) + STL_NAMESPACE::swap(bitmap[i], x.bitmap[i]); // swap not defined on arrays + STL_NAMESPACE::swap(num_buckets, x.num_buckets); + } + + // It's always nice to be able to clear a table without deallocating it + void clear() { + free_group(); + memset(bitmap, 0, sizeof(bitmap)); + num_buckets = 0; + } + + // Functions that tell you about size. Alas, these aren't so useful + // because our table is always fixed size. + size_type size() const { return GROUP_SIZE; } + size_type max_size() const { return GROUP_SIZE; } + bool empty() const { return false; } + // We also may want to know how many *used* buckets there are + size_type num_nonempty() const { return num_buckets; } + + + // get()/set() are explicitly const/non-const. You can use [] if + // you want something that can be either (potentially more expensive). + const_reference get(size_type i) const { + if ( bmtest(i) ) // bucket i is occupied + return group[pos_to_offset(bitmap, i)]; + else + return default_value(); // return the default reference + } + + // TODO(csilvers): make protected + friend + // This is used by sparse_hashtable to get an element from the table + // when we know it exists. + const_reference unsafe_get(size_type i) const { + assert(bmtest(i)); + return group[pos_to_offset(bitmap, i)]; + } + + // TODO(csilvers): make protected + friend + reference mutating_get(size_type i) { // fills bucket i before getting + if ( !bmtest(i) ) + set(i, default_value()); + return group[pos_to_offset(bitmap, i)]; + } + + // Syntactic sugar. It's easy to return a const reference. To + // return a non-const reference, we need to use the assigner adaptor. + const_reference operator[](size_type i) const { + return get(i); + } + + element_adaptor operator[](size_type i) { + return element_adaptor(this, i); + } + + private: + // Create space at group[offset], assuming value_type has trivial + // copy constructor and destructor. (Really, we want it to have + // "trivial move", because that's what realloc and memmove both do. + // But there's no way to capture that using type_traits, so we + // pretend that move(x, y) is equivalent to "x.~T(); new(x) T(y);" + // which is pretty much correct, if a bit conservative.) + void set_aux(size_type offset, true_type) { + group = (value_type *) + realloc_or_die(group, sizeof(*group) * (num_buckets+1)); + // This is equivalent to memmove(), but faster on my Intel P4, + // at least with gcc4.1 -O2 / glibc 2.3.6. + for (size_type i = num_buckets; i > offset; --i) + memcpy(group + i, group + i-1, sizeof(*group)); + } + + // Create space at group[offset], without special assumptions about value_type + void set_aux(size_type offset, false_type) { + // This is valid because 0 <= offset <= num_buckets + value_type* p = allocate_group(num_buckets + 1); + uninitialized_copy(group, group + offset, p); + uninitialized_copy(group + offset, group + num_buckets, p + offset + 1); + free_group(); + group = p; + } + + public: + // This returns a reference to the inserted item (which is a copy of val). + // TODO(austern): Make this exception safe: handle exceptions from + // value_type's copy constructor. + reference set(size_type i, const_reference val) { + size_type offset = pos_to_offset(bitmap, i); // where we'll find (or insert) + if ( bmtest(i) ) { + // Delete the old value, which we're replacing with the new one + group[offset].~value_type(); + } else { + typedef integral_constant::value && + has_trivial_destructor::value)> + realloc_and_memmove_ok; // we pretend mv(x,y) == "x.~T(); new(x) T(y)" + set_aux(offset, realloc_and_memmove_ok()); + ++num_buckets; + bmset(i); + } + // This does the actual inserting. Since we made the array using + // malloc, we use "placement new" to just call the constructor. + new(&group[offset]) value_type(val); + return group[offset]; + } + + // We let you see if a bucket is non-empty without retrieving it + bool test(size_type i) const { + return bmtest(i) ? true : false; // cast an int to a bool + } + bool test(iterator pos) const { + return bmtest(pos.pos) ? true : false; + } + + private: + // Shrink the array, assuming value_type has trivial copy + // constructor and destructor. (Really, we want it to have "trivial + // move", because that's what realloc and memmove both do. But + // there's no way to capture that using type_traits, so we pretend + // that move(x, y) is equivalent to ""x.~T(); new(x) T(y);" + // which is pretty much correct, if a bit conservative.) + void erase_aux(size_type offset, true_type) { + // This isn't technically necessary, since we know we have a + // trivial destructor, but is a cheap way to get a bit more safety. + group[offset].~value_type(); + // This is equivalent to memmove(), but faster on my Intel P4, + // at lesat with gcc4.1 -O2 / glibc 2.3.6. + assert(num_buckets > 0); + for (size_type i = offset; i < num_buckets-1; ++i) + memcpy(group + i, group + i+1, sizeof(*group)); // hopefully inlined! + group = (value_type *) + realloc_or_die(group, sizeof(*group) * (num_buckets-1)); + } + + // Shrink the array, without any special assumptions about value_type. + void erase_aux(size_type offset, false_type) { + // This is valid because 0 <= offset < num_buckets. Note the inequality. + value_type* p = allocate_group(num_buckets - 1); + uninitialized_copy(group, group + offset, p); + uninitialized_copy(group + offset + 1, group + num_buckets, p + offset); + free_group(); + group = p; + } + + public: + // This takes the specified elements out of the group. This is + // "undefining", rather than "clearing". + // TODO(austern): Make this exception safe: handle exceptions from + // value_type's copy constructor. + void erase(size_type i) { + if ( bmtest(i) ) { // trivial to erase empty bucket + size_type offset = pos_to_offset(bitmap,i); // where we'll find (or insert) + if ( num_buckets == 1 ) { + free_group(); + group = NULL; + } else { + typedef integral_constant::value && + has_trivial_destructor::value)> + realloc_and_memmove_ok; // pretend mv(x,y) == "x.~T(); new(x) T(y)" + erase_aux(offset, realloc_and_memmove_ok()); + } + --num_buckets; + bmclear(i); + } + } + + void erase(iterator pos) { + erase(pos.pos); + } + + void erase(iterator start_it, iterator end_it) { + // This could be more efficient, but to do so we'd need to make + // bmclear() clear a range of indices. Doesn't seem worth it. + for ( ; start_it != end_it; ++start_it ) + erase(start_it); + } + + + // I/O + // We support reading and writing groups to disk. We don't store + // the actual array contents (which we don't know how to store), + // just the bitmap and size. Meant to be used with table I/O. + // Returns true if all was ok + bool write_metadata(FILE *fp) const { + assert(sizeof(num_buckets) == 2); // we explicitly set to u_int16_t + PUT_(num_buckets, 8); + PUT_(num_buckets, 0); + if ( !fwrite(bitmap, sizeof(bitmap), 1, fp) ) return false; + return true; + } + + // Reading destroys the old group contents! Returns true if all was ok + bool read_metadata(FILE *fp) { + clear(); + + int x; // the GET_ macro requires an 'int x' to be defined + GET_(num_buckets, 8); + GET_(num_buckets, 0); + + if ( !fread(bitmap, sizeof(bitmap), 1, fp) ) return false; + + // We'll allocate the space, but we won't fill it: it will be + // left as uninitialized raw memory. + group = allocate_group(num_buckets); + return true; + } + + // If your keys and values are simple enough, we can write them + // to disk for you. "simple enough" means POD and no pointers. + // However, we don't try to normalize endianness + bool write_nopointer_data(FILE *fp) const { + for ( const_nonempty_iterator it = nonempty_begin(); + it != nonempty_end(); ++it ) { + if ( !fwrite(&*it, sizeof(*it), 1, fp) ) return false; + } + return true; + } + + // When reading, we have to override the potential const-ness of *it. + // Again, only meaningful if value_type is a POD. + bool read_nopointer_data(FILE *fp) { + for ( nonempty_iterator it = nonempty_begin(); + it != nonempty_end(); ++it ) { + if ( !fread(reinterpret_cast(&(*it)), sizeof(*it), 1, fp) ) + return false; + } + return true; + } + + // Comparisons. Note the comparisons are pretty arbitrary: we + // compare values of the first index that isn't equal (using default + // value for empty buckets). + bool operator==(const sparsegroup& x) const { + return ( num_buckets == x.num_buckets && + memcmp(bitmap, x.bitmap, sizeof(bitmap)) == 0 && + STL_NAMESPACE::equal(begin(), end(), x.begin()) ); // from algorithm + } + bool operator<(const sparsegroup& x) const { // also from algorithm + return STL_NAMESPACE::lexicographical_compare(begin(), end(), + x.begin(), x.end()); + } + bool operator!=(const sparsegroup& x) const { return !(*this == x); } + bool operator<=(const sparsegroup& x) const { return !(x < *this); } + bool operator>(const sparsegroup& x) const { return x < *this; } + bool operator>=(const sparsegroup& x) const { return !(*this < x); } + + private: + // The actual data + value_type *group; // (small) array of T's + unsigned char bitmap[(GROUP_SIZE-1)/8 + 1]; // fancy math is so we round up + size_type num_buckets; // limits GROUP_SIZE to 64K +}; + +// We need a global swap as well +template +inline void swap(sparsegroup &x, sparsegroup &y) { + x.swap(y); +} + +// --------------------------------------------------------------------------- + + +template +class sparsetable { + public: + // Basic types + typedef T value_type; // stolen from stl_vector.h + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef table_iterator > iterator; + typedef const_table_iterator > const_iterator; + typedef table_element_adaptor > element_adaptor; + typedef value_type &reference; + typedef const value_type &const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef STL_NAMESPACE::reverse_iterator const_reverse_iterator; + typedef STL_NAMESPACE::reverse_iterator reverse_iterator; + + // These are our special iterators, that go over non-empty buckets in a + // table. These aren't const only because you can change non-empty bcks. + typedef two_d_iterator< vector< sparsegroup > > + nonempty_iterator; + typedef const_two_d_iterator< vector< sparsegroup > > + const_nonempty_iterator; + typedef STL_NAMESPACE::reverse_iterator reverse_nonempty_iterator; + typedef STL_NAMESPACE::reverse_iterator const_reverse_nonempty_iterator; + // Another special iterator: it frees memory as it iterates (used to resize) + typedef destructive_two_d_iterator< vector< sparsegroup > > + destructive_iterator; + + // Iterator functions + iterator begin() { return iterator(this, 0); } + const_iterator begin() const { return const_iterator(this, 0); } + iterator end() { return iterator(this, size()); } + const_iterator end() const { return const_iterator(this, size()); } + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + // Versions for our special non-empty iterator + nonempty_iterator nonempty_begin() { + return nonempty_iterator(groups.begin(), groups.end(), groups.begin()); + } + const_nonempty_iterator nonempty_begin() const { + return const_nonempty_iterator(groups.begin(),groups.end(), groups.begin()); + } + nonempty_iterator nonempty_end() { + return nonempty_iterator(groups.begin(), groups.end(), groups.end()); + } + const_nonempty_iterator nonempty_end() const { + return const_nonempty_iterator(groups.begin(), groups.end(), groups.end()); + } + reverse_nonempty_iterator nonempty_rbegin() { + return reverse_nonempty_iterator(nonempty_end()); + } + const_reverse_nonempty_iterator nonempty_rbegin() const { + return const_reverse_nonempty_iterator(nonempty_end()); + } + reverse_nonempty_iterator nonempty_rend() { + return reverse_nonempty_iterator(nonempty_begin()); + } + const_reverse_nonempty_iterator nonempty_rend() const { + return const_reverse_nonempty_iterator(nonempty_begin()); + } + destructive_iterator destructive_begin() { + return destructive_iterator(groups.begin(), groups.end(), groups.begin()); + } + destructive_iterator destructive_end() { + return destructive_iterator(groups.begin(), groups.end(), groups.end()); + } + + private: + typedef typename vector< sparsegroup >::reference + GroupsReference; + typedef typename + vector< sparsegroup >::const_reference + GroupsConstReference; + typedef typename vector< sparsegroup >::iterator + GroupsIterator; + typedef typename vector< sparsegroup >::const_iterator + GroupsConstIterator; + + // How to deal with the proper group + static size_type num_groups(size_type num) { // how many to hold num buckets + return num == 0 ? 0 : ((num-1) / GROUP_SIZE) + 1; + } + + u_int16_t pos_in_group(size_type i) const { + return static_cast(i % GROUP_SIZE); + } + size_type group_num(size_type i) const { + return i / GROUP_SIZE; + } + GroupsReference which_group(size_type i) { + return groups[group_num(i)]; + } + GroupsConstReference which_group(size_type i) const { + return groups[group_num(i)]; + } + + public: + // Constructors -- default, normal (when you specify size), and copy + sparsetable(size_type sz = 0) + : groups(num_groups(sz)), table_size(sz), num_buckets(0) { } + // We'll can get away with using the default copy constructor, + // and default destructor, and hence the default operator=. Huzzah! + + // Many STL algorithms use swap instead of copy constructors + void swap(sparsetable& x) { + STL_NAMESPACE::swap(groups, x.groups); + STL_NAMESPACE::swap(table_size, x.table_size); + STL_NAMESPACE::swap(num_buckets, x.num_buckets); + } + + // It's always nice to be able to clear a table without deallocating it + void clear() { + GroupsIterator group; + for ( group = groups.begin(); group != groups.end(); ++group ) { + group->clear(); + } + num_buckets = 0; + } + + // Functions that tell you about size. + // NOTE: empty() is non-intuitive! It does not tell you the number + // of not-empty buckets (use num_nonempty() for that). Instead + // it says whether you've allocated any buckets or not. + size_type size() const { return table_size; } + size_type max_size() const { return size_type(-1); } + bool empty() const { return table_size == 0; } + // We also may want to know how many *used* buckets there are + size_type num_nonempty() const { return num_buckets; } + + // OK, we'll let you resize one of these puppies + void resize(size_type new_size) { + groups.resize(num_groups(new_size)); + if ( new_size < table_size) { // lower num_buckets, clear last group + if ( pos_in_group(new_size) > 0 ) // need to clear inside last group + groups.back().erase(groups.back().begin() + pos_in_group(new_size), + groups.back().end()); + num_buckets = 0; // refigure # of used buckets + GroupsConstIterator group; + for ( group = groups.begin(); group != groups.end(); ++group ) + num_buckets += group->num_nonempty(); + } + table_size = new_size; + } + + + // We let you see if a bucket is non-empty without retrieving it + bool test(size_type i) const { + return which_group(i).test(pos_in_group(i)); + } + bool test(iterator pos) const { + return which_group(pos.pos).test(pos_in_group(pos.pos)); + } + bool test(const_iterator pos) const { + return which_group(pos.pos).test(pos_in_group(pos.pos)); + } + + // We only return const_references because it's really hard to + // return something settable for empty buckets. Use set() instead. + const_reference get(size_type i) const { + assert(i < table_size); + return which_group(i).get(pos_in_group(i)); + } + + // TODO(csilvers): make protected + friend + // This is used by sparse_hashtable to get an element from the table + // when we know it exists (because the caller has called test(i)). + const_reference unsafe_get(size_type i) const { + assert(i < table_size); + assert(test(i)); + return which_group(i).unsafe_get(pos_in_group(i)); + } + + // TODO(csilvers): make protected + friend element_adaptor + reference mutating_get(size_type i) { // fills bucket i before getting + assert(i < table_size); + size_type old_numbuckets = which_group(i).num_nonempty(); + reference retval = which_group(i).mutating_get(pos_in_group(i)); + num_buckets += which_group(i).num_nonempty() - old_numbuckets; + return retval; + } + + // Syntactic sugar. As in sparsegroup, the non-const version is harder + const_reference operator[](size_type i) const { + return get(i); + } + + element_adaptor operator[](size_type i) { + return element_adaptor(this, i); + } + + // Needed for hashtables, gets as a nonempty_iterator. Crashes for empty bcks + const_nonempty_iterator get_iter(size_type i) const { + assert(test(i)); // how can a nonempty_iterator point to an empty bucket? + return const_nonempty_iterator( + groups.begin(), groups.end(), + groups.begin() + group_num(i), + (groups[group_num(i)].nonempty_begin() + + groups[group_num(i)].pos_to_offset(pos_in_group(i)))); + } + // For nonempty we can return a non-const version + nonempty_iterator get_iter(size_type i) { + assert(test(i)); // how can a nonempty_iterator point to an empty bucket? + return nonempty_iterator( + groups.begin(), groups.end(), + groups.begin() + group_num(i), + (groups[group_num(i)].nonempty_begin() + + groups[group_num(i)].pos_to_offset(pos_in_group(i)))); + } + + + // This returns a reference to the inserted item (which is a copy of val) + // The trick is to figure out whether we're replacing or inserting anew + reference set(size_type i, const_reference val) { + assert(i < table_size); + size_type old_numbuckets = which_group(i).num_nonempty(); + reference retval = which_group(i).set(pos_in_group(i), val); + num_buckets += which_group(i).num_nonempty() - old_numbuckets; + return retval; + } + + // This takes the specified elements out of the table. This is + // "undefining", rather than "clearing". + void erase(size_type i) { + assert(i < table_size); + size_type old_numbuckets = which_group(i).num_nonempty(); + which_group(i).erase(pos_in_group(i)); + num_buckets += which_group(i).num_nonempty() - old_numbuckets; + } + + void erase(iterator pos) { + erase(pos.pos); + } + + void erase(iterator start_it, iterator end_it) { + // This could be more efficient, but then we'd need to figure + // out if we spanned groups or not. Doesn't seem worth it. + for ( ; start_it != end_it; ++start_it ) + erase(start_it); + } + + + // We support reading and writing tables to disk. We don't store + // the actual array contents (which we don't know how to store), + // just the groups and sizes. Returns true if all went ok. + + private: + // Every time the disk format changes, this should probably change too + static const unsigned long MAGIC_NUMBER = 0x24687531; + + // Old versions of this code write all data in 32 bits. We need to + // support these files as well as having support for 64-bit systems. + // So we use the following encoding scheme: for values < 2^32-1, we + // store in 4 bytes in big-endian order. For values > 2^32, we + // store 0xFFFFFFF followed by 8 bytes in big-endian order. This + // causes us to mis-read old-version code that stores exactly + // 0xFFFFFFF, but I don't think that is likely to have happened for + // these particular values. + static bool write_32_or_64(FILE* fp, size_type value) { + if ( value < 0xFFFFFFFFULL ) { // fits in 4 bytes + PUT_(value, 24); + PUT_(value, 16); + PUT_(value, 8); + PUT_(value, 0); + } else if ( value == 0xFFFFFFFFUL ) { // special case in 32bit systems + PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); // marker + PUT_(0, 0); PUT_(0, 0); PUT_(0, 0); PUT_(0, 0); + PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); + } else { + PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); PUT_(0xFF, 0); // marker + PUT_(value, 56); + PUT_(value, 48); + PUT_(value, 40); + PUT_(value, 32); + PUT_(value, 24); + PUT_(value, 16); + PUT_(value, 8); + PUT_(value, 0); + } + return true; + } + + static bool read_32_or_64(FILE* fp, size_type *value) { // reads into value + size_type first4 = 0; + int x; + GET_(first4, 24); + GET_(first4, 16); + GET_(first4, 8); + GET_(first4, 0); + if ( first4 < 0xFFFFFFFFULL ) { + *value = first4; + } else { + GET_(*value, 56); + GET_(*value, 48); + GET_(*value, 40); + GET_(*value, 32); + GET_(*value, 24); + GET_(*value, 16); + GET_(*value, 8); + GET_(*value, 0); + } + return true; + } + + public: + bool write_metadata(FILE *fp) const { + if ( !write_32_or_64(fp, MAGIC_NUMBER) ) return false; + if ( !write_32_or_64(fp, table_size) ) return false; + if ( !write_32_or_64(fp, num_buckets) ) return false; + + GroupsConstIterator group; + for ( group = groups.begin(); group != groups.end(); ++group ) + if ( group->write_metadata(fp) == false ) return false; + return true; + } + + // Reading destroys the old table contents! Returns true if read ok. + bool read_metadata(FILE *fp) { + size_type magic_read = 0; + if ( !read_32_or_64(fp, &magic_read) ) return false; + if ( magic_read != MAGIC_NUMBER ) { + clear(); // just to be consistent + return false; + } + + if ( !read_32_or_64(fp, &table_size) ) return false; + if ( !read_32_or_64(fp, &num_buckets) ) return false; + + resize(table_size); // so the vector's sized ok + GroupsIterator group; + for ( group = groups.begin(); group != groups.end(); ++group ) + if ( group->read_metadata(fp) == false ) return false; + return true; + } + + // This code is identical to that for SparseGroup + // If your keys and values are simple enough, we can write them + // to disk for you. "simple enough" means no pointers. + // However, we don't try to normalize endianness + bool write_nopointer_data(FILE *fp) const { + for ( const_nonempty_iterator it = nonempty_begin(); + it != nonempty_end(); ++it ) { + if ( !fwrite(&*it, sizeof(*it), 1, fp) ) return false; + } + return true; + } + + // When reading, we have to override the potential const-ness of *it + bool read_nopointer_data(FILE *fp) { + for ( nonempty_iterator it = nonempty_begin(); + it != nonempty_end(); ++it ) { + if ( !fread(reinterpret_cast(&(*it)), sizeof(*it), 1, fp) ) + return false; + } + return true; + } + + // Comparisons. Note the comparisons are pretty arbitrary: we + // compare values of the first index that isn't equal (using default + // value for empty buckets). + bool operator==(const sparsetable& x) const { + return ( table_size == x.table_size && + num_buckets == x.num_buckets && + groups == x.groups ); + } + bool operator<(const sparsetable& x) const { // also from algobase.h + return STL_NAMESPACE::lexicographical_compare(begin(), end(), + x.begin(), x.end()); + } + bool operator!=(const sparsetable& x) const { return !(*this == x); } + bool operator<=(const sparsetable& x) const { return !(x < *this); } + bool operator>(const sparsetable& x) const { return x < *this; } + bool operator>=(const sparsetable& x) const { return !(*this < x); } + + + private: + // The actual data + vector< sparsegroup > groups; // our list of groups + size_type table_size; // how many buckets they want + size_type num_buckets; // number of non-empty buckets +}; + +// We need a global swap as well +template +inline void swap(sparsetable &x, sparsetable &y) { + x.swap(y); +} + +#undef GET_ +#undef PUT_ + +_END_GOOGLE_NAMESPACE_ + +#endif diff --git a/src/sparsehash-1.6/src/google/type_traits.h b/src/sparsehash-1.6/src/google/type_traits.h new file mode 100644 index 0000000..5f88133 --- /dev/null +++ b/src/sparsehash-1.6/src/google/type_traits.h @@ -0,0 +1,250 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ---- +// Author: Matt Austern +// +// Define a small subset of tr1 type traits. The traits we define are: +// is_integral +// is_floating_point +// is_pointer +// is_reference +// is_pod +// has_trivial_constructor +// has_trivial_copy +// has_trivial_assign +// has_trivial_destructor +// remove_const +// remove_volatile +// remove_cv +// remove_reference +// remove_pointer +// is_convertible +// We can add more type traits as required. + +#ifndef BASE_TYPE_TRAITS_H_ +#define BASE_TYPE_TRAITS_H_ + +#include +#include // For pair + +_START_GOOGLE_NAMESPACE_ + +// integral_constant, defined in tr1, is a wrapper for an integer +// value. We don't really need this generality; we could get away +// with hardcoding the integer type to bool. We use the fully +// general integer_constant for compatibility with tr1. + +template +struct integral_constant { + static const T value = v; + typedef T value_type; + typedef integral_constant type; +}; + +template const T integral_constant::value; + +// Abbreviations: true_type and false_type are structs that represent +// boolean true and false values. +typedef integral_constant true_type; +typedef integral_constant false_type; + +// Types small_ and big_ are guaranteed such that sizeof(small_) < +// sizeof(big_) +typedef char small_; + +struct big_ { + char dummy[2]; +}; + +// is_integral is false except for the built-in integer types. +template struct is_integral : false_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +#if defined(_MSC_VER) +// wchar_t is not by default a distinct type from unsigned short in +// Microsoft C. +// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx +template<> struct is_integral<__wchar_t> : true_type { }; +#else +template<> struct is_integral : true_type { }; +#endif +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +#ifdef HAVE_LONG_LONG +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +#endif + + +// is_floating_point is false except for the built-in floating-point types. +template struct is_floating_point : false_type { }; +template<> struct is_floating_point : true_type { }; +template<> struct is_floating_point : true_type { }; +template<> struct is_floating_point : true_type { }; + + +// is_pointer is false except for pointer types. +template struct is_pointer : false_type { }; +template struct is_pointer : true_type { }; + + +// is_reference is false except for reference types. +template struct is_reference : false_type {}; +template struct is_reference : true_type {}; + + +// We can't get is_pod right without compiler help, so fail conservatively. +// We will assume it's false except for arithmetic types and pointers, +// and const versions thereof. Note that std::pair is not a POD. +template struct is_pod + : integral_constant::value || + is_floating_point::value || + is_pointer::value)> { }; +template struct is_pod : is_pod { }; + + +// We can't get has_trivial_constructor right without compiler help, so +// fail conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial +// constructors. (3) array of a type with a trivial constructor. +// (4) const versions thereof. +template struct has_trivial_constructor : is_pod { }; +template struct has_trivial_constructor > + : integral_constant::value && + has_trivial_constructor::value)> { }; +template struct has_trivial_constructor + : has_trivial_constructor { }; +template struct has_trivial_constructor + : has_trivial_constructor { }; + +// We can't get has_trivial_copy right without compiler help, so fail +// conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial copy +// constructors. (3) array of a type with a trivial copy constructor. +// (4) const versions thereof. +template struct has_trivial_copy : is_pod { }; +template struct has_trivial_copy > + : integral_constant::value && + has_trivial_copy::value)> { }; +template struct has_trivial_copy + : has_trivial_copy { }; +template struct has_trivial_copy : has_trivial_copy { }; + +// We can't get has_trivial_assign right without compiler help, so fail +// conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial copy +// constructors. (3) array of a type with a trivial assign constructor. +template struct has_trivial_assign : is_pod { }; +template struct has_trivial_assign > + : integral_constant::value && + has_trivial_assign::value)> { }; +template struct has_trivial_assign + : has_trivial_assign { }; + +// We can't get has_trivial_destructor right without compiler help, so +// fail conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial +// destructors. (3) array of a type with a trivial destructor. +// (4) const versions thereof. +template struct has_trivial_destructor : is_pod { }; +template struct has_trivial_destructor > + : integral_constant::value && + has_trivial_destructor::value)> { }; +template struct has_trivial_destructor + : has_trivial_destructor { }; +template struct has_trivial_destructor + : has_trivial_destructor { }; + +// Specified by TR1 [4.7.1] +template struct remove_const { typedef T type; }; +template struct remove_const { typedef T type; }; +template struct remove_volatile { typedef T type; }; +template struct remove_volatile { typedef T type; }; +template struct remove_cv { + typedef typename remove_const::type>::type type; +}; + + +// Specified by TR1 [4.7.2] +template struct remove_reference { typedef T type; }; +template struct remove_reference { typedef T type; }; + +// Specified by TR1 [4.7.4] Pointer modifications. +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { + typedef T type; }; + +// Specified by TR1 [4.6] Relationships between types +#ifndef _MSC_VER +namespace internal { + +// This class is an implementation detail for is_convertible, and you +// don't need to know how it works to use is_convertible. For those +// who care: we declare two different functions, one whose argument is +// of type To and one with a variadic argument list. We give them +// return types of different size, so we can use sizeof to trick the +// compiler into telling us which function it would have chosen if we +// had called it with an argument of type From. See Alexandrescu's +// _Modern C++ Design_ for more details on this sort of trick. + +template +struct ConvertHelper { + static small_ Test(To); + static big_ Test(...); + static From Create(); +}; +} // namespace internal + +// Inherits from true_type if From is convertible to To, false_type otherwise. +template +struct is_convertible + : integral_constant::Test( + internal::ConvertHelper::Create())) + == sizeof(small_)> { +}; +#endif + +_END_GOOGLE_NAMESPACE_ + +#endif // BASE_TYPE_TRAITS_H_ diff --git a/src/sparsehash-1.6/src/hashtable_unittest.cc b/src/sparsehash-1.6/src/hashtable_unittest.cc new file mode 100644 index 0000000..3dcbfee --- /dev/null +++ b/src/sparsehash-1.6/src/hashtable_unittest.cc @@ -0,0 +1,1531 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Craig Silverstein +// +// This tests +// This tests +// This tests +// This tests +// This tests +// This tests + +// Since {dense,sparse}hashtable is templatized, it's important that +// we test every function in every class in this file -- not just to +// see if it works, but even if it compiles. + +#include "config.h" +#include +#include // for stat() +#ifdef HAVE_UNISTD_H +#include // for unlink() +#endif +#include +#include // for silly random-number-seed generator +#include // for sqrt() +#include +#include +#include // for insert_iterator +#include +#include // for setprecision() +#include +#include // for std::length_error +#include HASH_FUN_H // defined in config.h +#include +#include +#include +#include +#include +#include +#include + +// Otherwise, VC++7 warns about size_t -> int in the cout logging lines +#ifdef _MSC_VER +#pragma warning(disable:4267) +#endif + +using GOOGLE_NAMESPACE::sparse_hash_map; +using GOOGLE_NAMESPACE::dense_hash_map; +using GOOGLE_NAMESPACE::sparse_hash_set; +using GOOGLE_NAMESPACE::dense_hash_set; +using GOOGLE_NAMESPACE::sparse_hashtable; +using GOOGLE_NAMESPACE::dense_hashtable; +using STL_NAMESPACE::map; +using STL_NAMESPACE::set; +using STL_NAMESPACE::pair; +using STL_NAMESPACE::make_pair; +using STL_NAMESPACE::string; +using STL_NAMESPACE::insert_iterator; +using STL_NAMESPACE::allocator; +using STL_NAMESPACE::equal_to; +using STL_NAMESPACE::ostream; + +#define LOGF STL_NAMESPACE::cout // where we log to; LOGF is a historical name + +#define CHECK(cond) do { \ + if (!(cond)) { \ + LOGF << "Test failed: " #cond "\n"; \ + exit(1); \ + } \ +} while (0) + +#define CHECK_EQ(a, b) CHECK((a) == (b)) +#define CHECK_LT(a, b) CHECK((a) < (b)) +#define CHECK_GE(a, b) CHECK((a) >= (b)) + +#ifndef _MSC_VER // windows defines its own version +static string TmpFile(const char* basename) { + return string("/tmp/") + basename; +} +#endif + +const char *words[] = {"Baffin\n", // in /usr/dict/words + "Boffin\n", // not in + "baffin\n", // not in + "genial\n", // last word in + "Aarhus\n", // first word alphabetically + "Zurich\n", // last word alphabetically + "Getty\n", +}; + +const char *nwords[] = {"Boffin\n", + "baffin\n", +}; + +const char *default_dict[] = {"Aarhus\n", + "aback\n", + "abandon\n", + "Baffin\n", + "baffle\n", + "bagged\n", + "congenial\n", + "genial\n", + "Getty\n", + "indiscreet\n", + "linens\n", + "pence\n", + "reassure\n", + "sequel\n", + "zoning\n", + "zoo\n", + "Zurich\n", +}; + +// Likewise, it's not standard to hash a string pre-tr1. Luckily, it is a char* +#ifdef HAVE_UNORDERED_MAP +typedef SPARSEHASH_HASH StrHash; +struct CharStarHash { + size_t operator()(const char* s) const { + return StrHash()(string(s)); + } + // These are used by MSVC: + bool operator()(const char* a, const char* b) const { + return strcmp(a, b) < 0; + } + static const size_t bucket_size = 4; // These are required by MSVC + static const size_t min_buckets = 8; // 4 and 8 are the defaults +}; +#else +typedef SPARSEHASH_HASH CharStarHash; +struct StrHash { + size_t operator()(const string& s) const { + return SPARSEHASH_HASH()(s.c_str()); + } + // These are used by MSVC: + bool operator()(const string& a, const string& b) const { + return a < b; + } + static const size_t bucket_size = 4; // These are required by MSVC + static const size_t min_buckets = 8; // 4 and 8 are the defaults +}; +#endif + +// Let us log the pairs that make up a hash_map +template +ostream& operator<<(ostream& s, const pair& p) { + s << "pair(" << p.first << ", " << p.second << ")"; + return s; +} + +struct strcmp_fnc { + bool operator()(const char* s1, const char* s2) const { + return ((s1 == 0 && s2 == 0) || + (s1 && s2 && *s1 == *s2 && strcmp(s1, s2) == 0)); + } +}; + +namespace { + +template +void set_empty_key(sparse_hashtable *ht, T val) { +} + +template +void set_empty_key(sparse_hash_set *ht, T val) { +} + +template +void set_empty_key(sparse_hash_map *ht, K val) { +} + +template +void set_empty_key(dense_hashtable *ht, T val) { + ht->set_empty_key(val); +} + +template +void set_empty_key(dense_hash_set *ht, T val) { + ht->set_empty_key(val); +} + +template +void set_empty_key(dense_hash_map *ht, K val) { + ht->set_empty_key(val); +} + +template +bool clear_no_resize(sparse_hashtable *ht) { + return false; +} + +template +bool clear_no_resize(sparse_hash_set *ht) { + return false; +} + +template +bool clear_no_resize(sparse_hash_map *ht) { + return false; +} + +template +bool clear_no_resize(dense_hashtable *ht) { + ht->clear_no_resize(); + return true; +} + +template +bool clear_no_resize(dense_hash_set *ht) { + ht->clear_no_resize(); + return true; +} + +template +bool clear_no_resize(dense_hash_map *ht) { + ht->clear_no_resize(); + return true; +} + +template +void insert(dense_hashtable *ht, T val) { + ht->insert(val); +} + +template +void insert(dense_hash_set *ht, T val) { + ht->insert(val); +} + +template +void insert(dense_hash_map *ht, K val) { + ht->insert(pair(val,V())); +} + +template +void insert(sparse_hashtable *ht, T val) { + ht->insert(val); +} + +template +void insert(sparse_hash_set *ht, T val) { + ht->insert(val); +} + +template +void insert(sparse_hash_map *ht, K val) { + ht->insert(pair(val,V())); +} + +template +void insert(HT *ht, Iterator begin, Iterator end) { + ht->insert(begin, end); +} + +// For hashtable's and hash_set's, the iterator insert works fine (and +// is used). But for the hash_map's, the iterator insert expects the +// iterators to point to pair's. So by looping over and calling insert +// on each element individually, the code below automatically expands +// into inserting a pair. +template +void insert(dense_hash_map *ht, Iterator begin, Iterator end) { + while (begin != end) { + insert(ht, *begin); + ++begin; + } +} + +template +void insert(sparse_hash_map *ht, Iterator begin, Iterator end) { + while (begin != end) { + insert(ht, *begin); + ++begin; + } +} + +// A version of insert that uses the insert_iterator. But insert_iterator +// isn't defined for the low level hashtable classes, so we just punt to insert. + +template +void iterator_insert(dense_hashtable* ht, T val, + insert_iterator >* ) { + ht->insert(val); +} + +template +void iterator_insert(dense_hash_set* , T val, + insert_iterator >* ii) { + *(*ii)++ = val; +} + +template +void iterator_insert(dense_hash_map* , K val, + insert_iterator >* ii) { + *(*ii)++ = pair(val,V()); +} + +template +void iterator_insert(sparse_hashtable* ht, T val, + insert_iterator >* ) { + ht->insert(val); +} + +template +void iterator_insert(sparse_hash_set* , T val, + insert_iterator >* ii) { + *(*ii)++ = val; +} + +template +void iterator_insert(sparse_hash_map *, K val, + insert_iterator >* ii) { + *(*ii)++ = pair(val,V()); +} + + +void write_item(FILE *fp, const char *val) { + fwrite(val, strlen(val), 1, fp); // \n serves to separate +} + +// The weird 'const' declarations are desired by the compiler. Yucko. +void write_item(FILE *fp, const pair &val) { + fwrite(val.first, strlen(val.first), 1, fp); +} + +void write_item(FILE *fp, const string &val) { + fwrite(val.data(), val.length(), 1, fp); // \n serves to separate +} + +// The weird 'const' declarations are desired by the compiler. Yucko. +void write_item(FILE *fp, const pair &val) { + fwrite(val.first.data(), val.first.length(), 1, fp); +} + +char* read_line(FILE* fp, char* line, int linesize) { + if ( fgets(line, linesize, fp) == NULL ) + return NULL; + // normalize windows files :-( + const size_t linelen = strlen(line); + if ( linelen >= 2 && line[linelen-2] == '\r' && line[linelen-1] == '\n' ) { + line[linelen-2] = '\n'; + line[linelen-1] = '\0'; + } + return line; +} + +void read_item(FILE *fp, char*const* val) { + char line[1024]; + read_line(fp, line, sizeof(line)); + char **p = const_cast(val); + *p = strdup(line); +} + +void read_item(FILE *fp, pair *val) { + char line[1024]; + read_line(fp, line, sizeof(line)); + char **p = const_cast(&val->first); + *p = strdup(line); +} + +void read_item(FILE *fp, const string* val) { + char line[1024]; + read_line(fp, line, sizeof(line)); + new(const_cast(val)) string(line); // need to use placement new +} + +void read_item(FILE *fp, pair *val) { + char line[1024]; + read_line(fp, line, sizeof(line)); + new(const_cast(&val->first)) string(line); +} + +void free_item(char*const* val) { + free(*val); +} + +void free_item(pair *val) { + free(val->first); +} + +int get_int_item(int int_item) { + return int_item; +} + +int get_int_item(pair val) { + return val.first; +} + +int getintkey(int i) { return i; } + +int getintkey(const pair &p) { return p.first; } + +} // end anonymous namespace + +// Performs tests where the hashtable's value type is assumed to be int. +template +void test_int() { + htint x; + htint y(1000); + htint z(64); + set_empty_key(&x, 0xefefef); + set_empty_key(&y, 0xefefef); + set_empty_key(&z, 0xefefef); + + CHECK(y.empty()); + insert(&y, 1); + CHECK(!y.empty()); + insert(&y, 11); + insert(&y, 111); + insert(&y, 1111); + insert(&y, 11111); + insert(&y, 111111); + insert(&y, 1111111); // 1M, more or less + insert(&y, 11111111); + insert(&y, 111111111); + insert(&y, 1111111111); // 1B, more or less + for ( int i = 0; i < 64; ++i ) + insert(&z, i); + // test the second half of the insert with an insert_iterator + insert_iterator insert_iter(z, z.begin()); + for ( int i = 32; i < 64; ++i ) + iterator_insert(&z, i, &insert_iter); + + // only perform the following CHECKs for + // dense{hashtable, _hash_set, _hash_map} + if (clear_no_resize(&x)) { + // make sure x has to increase its number of buckets + typename htint::size_type empty_bucket_count = x.bucket_count(); + int last_element = 0; + while (x.bucket_count() == empty_bucket_count) { + insert(&x, last_element); + ++last_element; + } + // if clear_no_resize is supported (i.e. htint is a + // dense{hashtable,_hash_set,_hash_map}), it should leave the bucket_count + // as is. + typename htint::size_type last_bucket_count = x.bucket_count(); + clear_no_resize(&x); + CHECK(last_bucket_count == x.bucket_count()); + CHECK(x.empty()); + LOGF << "x has " << x.bucket_count() << " buckets\n"; + LOGF << "x size " << x.size() << "\n"; + // when inserting the same number of elements again, no resize should be + // necessary + for (int i = 0; i < last_element; ++i) { + insert(&x, i); + CHECK(x.bucket_count() == last_bucket_count); + } + } + + for ( typename htint::const_iterator it = y.begin(); it != y.end(); ++it ) + LOGF << "y: " << get_int_item(*it) << "\n"; + z.insert(y.begin(), y.end()); + swap(y,z); + for ( typename htint::iterator it = y.begin(); it != y.end(); ++it ) + LOGF << "y+z: " << get_int_item(*it) << "\n"; + LOGF << "z has " << z.bucket_count() << " buckets\n"; + LOGF << "y has " << y.bucket_count() << " buckets\n"; + LOGF << "z size: " << z.size() << "\n"; + + for (int i = 0; i < 64; ++i) + CHECK(y.find(i) != y.end()); + + CHECK(z.size() == 10); + z.set_deleted_key(1010101010); // an unused value + CHECK(z.deleted_key() == 1010101010); + z.erase(11111); + CHECK(z.size() == 9); + insert(&z, 11111); // should retake deleted value + CHECK(z.size() == 10); + // Do the delete/insert again. Last time we probably resized; this time no + z.erase(11111); + insert(&z, 11111); // should retake deleted value + CHECK(z.size() == 10); + + z.erase(-11111); // shouldn't do anything + CHECK(z.size() == 10); + z.erase(1); + CHECK(z.size() == 9); + + typename htint::iterator itdel = z.find(1111); + pair itdel2 + = z.equal_range(1111); + CHECK(itdel2.first != z.end()); + CHECK(&*itdel2.first == &*itdel); // while we're here, check equal_range() + CHECK(itdel2.second == ++itdel2.first); + pair itdel3 + = const_cast(&z)->equal_range(1111); + CHECK(itdel3.first != z.end()); + CHECK(&*itdel3.first == &*itdel); + CHECK(itdel3.second == ++itdel3.first); + + z.erase(itdel); + CHECK(z.size() == 8); + itdel2 = z.equal_range(1111); + CHECK(itdel2.first == z.end()); + CHECK(itdel2.second == itdel2.first); + itdel3 = const_cast(&z)->equal_range(1111); + CHECK(itdel3.first == z.end()); + CHECK(itdel3.second == itdel3.first); + + itdel = z.find(2222); // should be end() + z.erase(itdel); // shouldn't do anything + CHECK(z.size() == 8); + for ( typename htint::const_iterator it = z.begin(); it != z.end(); ++it ) + LOGF << "y: " << get_int_item(*it) << "\n"; + z.set_deleted_key(1010101011); // a different unused value + CHECK(z.deleted_key() == 1010101011); + for ( typename htint::const_iterator it = z.begin(); it != z.end(); ++it ) + LOGF << "y: " << get_int_item(*it) << "\n"; + LOGF << "That's " << z.size() << " elements\n"; + z.erase(z.begin(), z.end()); + CHECK(z.empty()); + + y.clear(); + CHECK(y.empty()); + LOGF << "y has " << y.bucket_count() << " buckets\n"; +} + +// Performs tests where the hashtable's value type is assumed to be char*. +// The read_write parameters specifies whether the read/write tests +// should be performed. Note that densehashtable::write_metdata is not +// implemented, so we only do the read/write tests for the +// sparsehashtable varieties. +template +void test_charptr(bool read_write) { + ht w; + set_empty_key(&w, (char*) NULL); + insert(&w, const_cast(nwords), + const_cast(nwords) + sizeof(nwords) / sizeof(*nwords)); + LOGF << "w has " << w.size() << " items\n"; + CHECK(w.size() == 2); + CHECK(w == w); + + ht x; + set_empty_key(&x, (char*) NULL); + long dict_size = 1; // for size stats -- can't be 0 'cause of division + + map counts; + // Hash the dictionary + { + // automake says 'look for all data files in $srcdir.' OK. + string filestr = (string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/words"); + const char* file = filestr.c_str(); + FILE *fp = fopen(file, "rb"); + if ( fp == NULL ) { + LOGF << "Can't open " << file << ", using small, built-in dict...\n"; + for (int i = 0; i < sizeof(default_dict)/sizeof(*default_dict); ++i) { + insert(&x, strdup(default_dict[i])); + counts[default_dict[i]] = 0; + } + } else { + char line[1024]; + while ( read_line(fp, line, sizeof(line)) ) { + insert(&x, strdup(line)); + counts[line] = 0; + } + LOGF << "Read " << x.size() << " words from " << file << "\n"; + fclose(fp); + struct stat buf; + stat(file, &buf); + dict_size = buf.st_size; + LOGF << "Size of " << file << ": " << buf.st_size << " bytes\n"; + } + for (char **word = const_cast(words); + word < const_cast(words) + sizeof(words) / sizeof(*words); + ++word ) { + if (x.find(*word) == x.end()) { + CHECK(w.find(*word) != w.end()); + } else { + CHECK(w.find(*word) == w.end()); + } + } + } + CHECK(counts.size() == x.size()); + + // Save the hashtable. + if (read_write) { + const string file_string = TmpFile(".hashtable_unittest_dicthash"); + const char* file = file_string.c_str(); + FILE *fp = fopen(file, "wb"); + if ( fp == NULL ) { + // maybe we can't write to /tmp/. Try the current directory + file = ".hashtable_unittest_dicthash"; + fp = fopen(file, "wb"); + } + if ( fp == NULL ) { + LOGF << "Can't open " << file << " skipping hashtable save...\n"; + } else { + x.write_metadata(fp); // this only writes meta-information + int write_count = 0; + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + write_item(fp, *it); + free_item(&(*it)); + ++write_count; + } + LOGF << "Wrote " << write_count << " words to " << file << "\n"; + fclose(fp); + struct stat buf; + stat(file, &buf); + LOGF << "Size of " << file << ": " << buf.st_size << " bytes\n"; + LOGF << STL_NAMESPACE::setprecision(3) + << "Hashtable overhead " + << (buf.st_size - dict_size) * 100.0 / dict_size + << "% (" + << (buf.st_size - dict_size) * 8.0 / write_count + << " bits/entry)\n"; + x.clear(); + + // Load the hashtable + fp = fopen(file, "rb"); + if ( fp == NULL ) { + LOGF << "Can't open " << file << " skipping hashtable reload...\n"; + } else { + x.read_metadata(fp); // reads metainformation + LOGF << "Hashtable size: " << x.size() << "\n"; + int read_count = 0; + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + read_item(fp, &(*it)); + ++read_count; + } + LOGF << "Read " << read_count << " words from " << file << "\n"; + fclose(fp); + unlink(file); + for ( char **word = const_cast(words); + word < const_cast(words) + sizeof(words) / sizeof(*words); + ++word ) { + if (x.find(*word) == x.end()) { + CHECK(w.find(*word) != w.end()); + } else { + CHECK(w.find(*word) == w.end()); + } + } + } + } + } + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + free_item(&(*it)); + } +} + +// Perform tests where the hashtable's value type is assumed to +// be string. +// TODO(austern): factor out the bulk of test_charptr and test_string +// into a common function. +template +void test_string(bool read_write) { + ht w; + set_empty_key(&w, string("-*- empty key -*-")); + const int N = sizeof(nwords) / sizeof(*nwords); + string* nwords1 = new string[N]; + for (int i = 0; i < N; ++i) + nwords1[i] = nwords[i]; + insert(&w, nwords1, nwords1 + N); + delete[] nwords1; + LOGF << "w has " << w.size() << " items\n"; + CHECK(w.size() == 2); + CHECK(w == w); + + ht x; + set_empty_key(&x, string("-*- empty key -*-")); + long dict_size = 1; // for size stats -- can't be 0 'cause of division + + map counts; + // Hash the dictionary + { + // automake says 'look for all data files in $srcdir.' OK. + string filestr = (string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/words"); + const char* file = filestr.c_str(); + FILE *fp = fopen(file, "rb"); + if ( fp == NULL ) { + LOGF << "Can't open " << file << ", using small, built-in dict...\n"; + for (int i = 0; i < sizeof(default_dict)/sizeof(*default_dict); ++i) { + insert(&x, string(default_dict[i])); + counts[default_dict[i]] = 0; + } + } else { + char line[1024]; + while ( fgets(line, sizeof(line), fp) ) { + insert(&x, string(line)); + counts[line] = 0; + } + LOGF << "Read " << x.size() << " words from " << file << "\n"; + fclose(fp); + struct stat buf; + stat(file, &buf); + dict_size = buf.st_size; + LOGF << "Size of " << file << ": " << buf.st_size << " bytes\n"; + } + for ( const char* const* word = words; + word < words + sizeof(words) / sizeof(*words); + ++word ) { + if (x.find(*word) == x.end()) { + CHECK(w.find(*word) != w.end()); + } else { + CHECK(w.find(*word) == w.end()); + } + } + } + CHECK(counts.size() == x.size()); + { + // verify that size() works correctly + int xcount = 0; + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + ++xcount; + } + CHECK(x.size() == xcount); + } + + // Save the hashtable. + if (read_write) { + const string file_string = TmpFile(".hashtable_unittest_dicthash_str"); + const char* file = file_string.c_str(); + FILE *fp = fopen(file, "wb"); + if ( fp == NULL ) { + // maybe we can't write to /tmp/. Try the current directory + file = ".hashtable_unittest_dicthash_str"; + fp = fopen(file, "wb"); + } + if ( fp == NULL ) { + LOGF << "Can't open " << file << " skipping hashtable save...\n"; + } else { + x.write_metadata(fp); // this only writes meta-information + int write_count = 0; + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + write_item(fp, *it); + ++write_count; + } + LOGF << "Wrote " << write_count << " words to " << file << "\n"; + fclose(fp); + struct stat buf; + stat(file, &buf); + LOGF << "Size of " << file << ": " << buf.st_size << " bytes\n"; + LOGF << STL_NAMESPACE::setprecision(3) + << "Hashtable overhead " + << (buf.st_size - dict_size) * 100.0 / dict_size + << "% (" + << (buf.st_size - dict_size) * 8.0 / write_count + << " bits/entry)\n"; + x.clear(); + + // Load the hashtable + fp = fopen(file, "rb"); + if ( fp == NULL ) { + LOGF << "Can't open " << file << " skipping hashtable reload...\n"; + } else { + x.read_metadata(fp); // reads metainformation + LOGF << "Hashtable size: " << x.size() << "\n"; + int count = 0; + for ( typename ht::iterator it = x.begin(); it != x.end(); ++it ) { + read_item(fp, &(*it)); + ++count; + } + LOGF << "Read " << count << " words from " << file << "\n"; + fclose(fp); + unlink(file); + for ( const char* const* word = words; + word < words + sizeof(words) / sizeof(*words); + ++word ) { + if (x.find(*word) == x.end()) { + CHECK(w.find(*word) != w.end()); + } else { + CHECK(w.find(*word) == w.end()); + } + } + } + } + } + + // ensure that destruction is done properly in clear_no_resize() + if (!clear_no_resize(&w)) w.clear(); +} + +// The read_write parameters specifies whether the read/write tests +// should be performed. Note that densehashtable::write_metdata is not +// implemented, so we only do the read/write tests for the +// sparsehashtable varieties. +template +void test(bool read_write) { + test_int(); + test_string(read_write); + test_charptr(read_write); +} + +// For data types with trivial copy-constructors and destructors, we +// should use an optimized routine for data-copying, that involves +// memmove. We test this by keeping count of how many times the +// copy-constructor is called; it should be much less with the +// optimized code. + +class Memmove { + public: + Memmove(): i_(0) {} + explicit Memmove(int i): i_(i) {} + Memmove(const Memmove& that) { + this->i_ = that.i_; + num_copies_++; + } + + int i_; + static int num_copies_; +}; +int Memmove::num_copies_ = 0; + + +// This is what tells the hashtable code it can use memmove for this class: +_START_GOOGLE_NAMESPACE_ +template<> struct has_trivial_copy : true_type { }; +template<> struct has_trivial_destructor : true_type { }; +_END_GOOGLE_NAMESPACE_ + +class NoMemmove { + public: + NoMemmove(): i_(0) {} + explicit NoMemmove(int i): i_(i) {} + NoMemmove(const NoMemmove& that) { + this->i_ = that.i_; + num_copies_++; + } + + int i_; + static int num_copies_; +}; +int NoMemmove::num_copies_ = 0; + +void TestSimpleDataTypeOptimizations() { + { + sparse_hash_map memmove; + sparse_hash_map nomemmove; + + Memmove::num_copies_ = 0; // reset + NoMemmove::num_copies_ = 0; // reset + for (int i = 10000; i > 0; i--) { + memmove[i] = Memmove(i); + } + for (int i = 10000; i > 0; i--) { + nomemmove[i] = NoMemmove(i); + } + LOGF << "sparse_hash_map copies for unoptimized/optimized cases: " + << NoMemmove::num_copies_ << "/" << Memmove::num_copies_ << "\n"; + CHECK(NoMemmove::num_copies_ > Memmove::num_copies_); + } + // Same should hold true for dense_hash_map + { + dense_hash_map memmove; + dense_hash_map nomemmove; + memmove.set_empty_key(0); + nomemmove.set_empty_key(0); + + Memmove::num_copies_ = 0; // reset + NoMemmove::num_copies_ = 0; // reset + for (int i = 10000; i > 0; i--) { + memmove[i] = Memmove(i); + } + for (int i = 10000; i > 0; i--) { + nomemmove[i] = NoMemmove(i); + } + LOGF << "dense_hash_map copies for unoptimized/optimized cases: " + << NoMemmove::num_copies_ << "/" << Memmove::num_copies_ << "\n"; + CHECK(NoMemmove::num_copies_ > Memmove::num_copies_); + } +} + +void TestShrinking() { + // We want to make sure that when we create a hashtable, and then + // add and delete one element, the size of the hashtable doesn't + // change. + { + sparse_hash_set s; + s.set_deleted_key(0); + const int old_bucket_count = s.bucket_count(); + s.insert(4); + s.erase(4); + s.insert(4); + s.erase(4); + CHECK_EQ(old_bucket_count, s.bucket_count()); + } + { + dense_hash_set s; + s.set_deleted_key(0); + s.set_empty_key(1); + const int old_bucket_count = s.bucket_count(); + s.insert(4); + s.erase(4); + s.insert(4); + s.erase(4); + CHECK_EQ(old_bucket_count, s.bucket_count()); + } + { + sparse_hash_set s(2); // start small: only expects 2 items + CHECK_LT(s.bucket_count(), 32); // verify we actually do start small + s.set_deleted_key(0); + const int old_bucket_count = s.bucket_count(); + s.insert(4); + s.erase(4); + s.insert(4); + s.erase(4); + CHECK_EQ(old_bucket_count, s.bucket_count()); + } + { + dense_hash_set s(2); // start small: only expects 2 items + CHECK_LT(s.bucket_count(), 32); // verify we actually do start small + s.set_deleted_key(0); + s.set_empty_key(1); + const int old_bucket_count = s.bucket_count(); + s.insert(4); + s.erase(4); + s.insert(4); + s.erase(4); + CHECK_EQ(old_bucket_count, s.bucket_count()); + } +} + +class TestHashFcn : public SPARSEHASH_HASH { + public: + explicit TestHashFcn(int i) + : id_(i) { + } + + int id() const { + return id_; + } + + private: + int id_; +}; + +class TestEqualTo : public equal_to { + public: + explicit TestEqualTo(int i) + : id_(i) { + } + + int id() const { + return id_; + } + + private: + int id_; +}; + +template

n&YR}rE_H5biylHm#8LvNH_pxy!X3-vR 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 literal 0 HcmV?d00001 diff --git a/src/sparsehash-1.6/m4/acx_pthread.m4 b/src/sparsehash-1.6/m4/acx_pthread.m4 new file mode 100644 index 0000000..2cf20de --- /dev/null +++ b/src/sparsehash-1.6/m4/acx_pthread.m4 @@ -0,0 +1,363 @@ +# This was retrieved from +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi +# See also (perhaps for new versions?) +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi +# +# We've rewritten the inconsistency check code (from avahi), to work +# more broadly. In particular, it no longer assumes ld accepts -zdefs. +# This caused a restructing of the code, but the functionality has only +# changed a little. + +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException +dnl +dnl Checks for GCC shared/pthread inconsistency based on work by +dnl Marcin Owsiany + + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi + + # The next part tries to detect GCC inconsistency with -shared on some + # architectures and systems. The problem is that in certain + # configurations, when -shared is specified, GCC "forgets" to + # internally use various flags which are still necessary. + + # + # Prepare the flags + # + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CC="$CC" + + # Try with the flags determined by the earlier checks. + # + # -Wl,-z,defs forces link-time symbol resolution, so that the + # linking checks with -shared actually have any value + # + # FIXME: -fPIC is required for -shared on many architectures, + # so we specify it here, but the right way would probably be to + # properly detect whether it is actually required. + CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CC="$PTHREAD_CC" + + # In order not to create several levels of indentation, we test + # the value of "$done" until we find the cure or run out of ideas. + done="no" + + # First, make sure the CFLAGS we added are actually accepted by our + # compiler. If not (and OS X's ld, for instance, does not accept -z), + # then we can't do this test. + if test x"$done" = xno; then + AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) + AC_TRY_LINK(,, , [done=yes]) + + if test "x$done" = xyes ; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + fi + fi + + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + # + # Linux gcc on some architectures such as mips/mipsel forgets + # about -lpthread + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lpthread fixes that]) + LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + # + # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lc_r fixes that]) + LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + if test x"$done" = xno; then + # OK, we have run out of ideas + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) + + # so it's not safe to assume that we may use pthreads + acx_pthread_ok=no + fi + + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + CC="$save_CC" +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/src/sparsehash-1.6/m4/google_namespace.m4 b/src/sparsehash-1.6/m4/google_namespace.m4 new file mode 100644 index 0000000..7f244cc --- /dev/null +++ b/src/sparsehash-1.6/m4/google_namespace.m4 @@ -0,0 +1,42 @@ +# Allow users to override the namespace we define our application's classes in +# Arg $1 is the default namespace to use if --enable-namespace isn't present. + +# In general, $1 should be 'google', so we put all our exported symbols in a +# unique namespace that is not likely to conflict with anyone else. However, +# when it makes sense -- for instance, when publishing stl-like code -- you +# may want to go with a different default, like 'std'. + +# We guarantee the invariant that GOOGLE_NAMESPACE starts with ::, +# unless it's the empty string. Thus, it's always safe to do +# GOOGLE_NAMESPACE::foo and be sure you're getting the foo that's +# actually in the google namespace, and not some other namespace that +# the namespace rules might kick in. + +AC_DEFUN([AC_DEFINE_GOOGLE_NAMESPACE], + [google_namespace_default=[$1] + AC_ARG_ENABLE(namespace, [ --enable-namespace=FOO to define these Google + classes in the FOO namespace. --disable-namespace + to define them in the global namespace. Default + is to define them in namespace $1.], + [case "$enableval" in + yes) google_namespace="$google_namespace_default" ;; + no) google_namespace="" ;; + *) google_namespace="$enableval" ;; + esac], + [google_namespace="$google_namespace_default"]) + if test -n "$google_namespace"; then + ac_google_namespace="::$google_namespace" + ac_google_start_namespace="namespace $google_namespace {" + ac_google_end_namespace="}" + else + ac_google_namespace="" + ac_google_start_namespace="" + ac_google_end_namespace="" + fi + AC_DEFINE_UNQUOTED(GOOGLE_NAMESPACE, $ac_google_namespace, + Namespace for Google classes) + AC_DEFINE_UNQUOTED(_START_GOOGLE_NAMESPACE_, $ac_google_start_namespace, + Puts following code inside the Google namespace) + AC_DEFINE_UNQUOTED(_END_GOOGLE_NAMESPACE_, $ac_google_end_namespace, + Stops putting the code inside the Google namespace) +]) diff --git a/src/sparsehash-1.6/m4/namespaces.m4 b/src/sparsehash-1.6/m4/namespaces.m4 new file mode 100644 index 0000000..d78dbe4 --- /dev/null +++ b/src/sparsehash-1.6/m4/namespaces.m4 @@ -0,0 +1,15 @@ +# Checks whether the compiler implements namespaces +AC_DEFUN([AC_CXX_NAMESPACES], + [AC_CACHE_CHECK(whether the compiler implements namespaces, + ac_cv_cxx_namespaces, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { + namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, + ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE]) + if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES, 1, [define if the compiler implements namespaces]) + fi]) diff --git a/src/sparsehash-1.6/m4/stl_hash.m4 b/src/sparsehash-1.6/m4/stl_hash.m4 new file mode 100644 index 0000000..a31baab --- /dev/null +++ b/src/sparsehash-1.6/m4/stl_hash.m4 @@ -0,0 +1,70 @@ +# We check two things: where the include file is for +# unordered_map/hash_map (we prefer the first form), and what +# namespace unordered/hash_map lives in within that include file. We +# include AC_TRY_COMPILE for all the combinations we've seen in the +# wild. We define HASH_MAP_H to the location of the header file, and +# HASH_NAMESPACE to the namespace the class (unordered_map or +# hash_map) is in. We define HAVE_UNORDERED_MAP if the class we found +# is named unordered_map, or leave it undefined if not. + +# This also checks if unordered map exists. +AC_DEFUN([AC_CXX_STL_HASH], + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_MSG_CHECKING(the location of hash_map) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cv_cxx_hash_map="" + # First try unordered_map, but not on gcc's before 4.2 -- I've + # seen unexplainable unordered_map bugs with -O2 on older gcc's. + AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)) + # error GCC too old for unordered_map + #endif + ], + [/* no program body necessary */], + [stl_hash_old_gcc=no], + [stl_hash_old_gcc=yes]) + for location in unordered_map tr1/unordered_map; do + for namespace in std std::tr1; do + if test -z "$ac_cv_cxx_hash_map" -a "$stl_hash_old_gcc" != yes; then + # Some older gcc's have a buggy tr1, so test a bit of code. + AC_TRY_COMPILE([#include <$location>], + [const ${namespace}::unordered_map t; + return t.find(5) == t.end();], + [ac_cv_cxx_hash_map="<$location>"; + ac_cv_cxx_hash_namespace="$namespace"; + ac_cv_cxx_have_unordered_map="yes";]) + fi + done + done + # Now try hash_map + for location in ext/hash_map hash_map; do + for namespace in __gnu_cxx "" std stdext; do + if test -z "$ac_cv_cxx_hash_map"; then + AC_TRY_COMPILE([#include <$location>], + [${namespace}::hash_map t], + [ac_cv_cxx_hash_map="<$location>"; + ac_cv_cxx_hash_namespace="$namespace"; + ac_cv_cxx_have_unordered_map="no";]) + fi + done + done + ac_cv_cxx_hash_set=`echo "$ac_cv_cxx_hash_map" | sed s/map/set/`; + if test -n "$ac_cv_cxx_hash_map"; then + AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map]) + AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set]) + AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map, + [the location of or ]) + AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set, + [the location of or ]) + AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace, + [the namespace of hash_map/hash_set]) + if test "$ac_cv_cxx_have_unordered_map" = yes; then + AC_DEFINE(HAVE_UNORDERED_MAP,1, + [define if the compiler supports unordered_{map,set}]) + fi + AC_MSG_RESULT([$ac_cv_cxx_hash_map]) + else + AC_MSG_RESULT() + AC_MSG_WARN([could not find an STL hash_map]) + fi +]) diff --git a/src/sparsehash-1.6/m4/stl_hash_fun.m4 b/src/sparsehash-1.6/m4/stl_hash_fun.m4 new file mode 100644 index 0000000..962b088 --- /dev/null +++ b/src/sparsehash-1.6/m4/stl_hash_fun.m4 @@ -0,0 +1,36 @@ +# We just try to figure out where hash<> is defined. It's in some file +# that ends in hash_fun.h... +# +# Ideally we'd use AC_CACHE_CHECK, but that only lets us store one value +# at a time, and we need to store two (filename and namespace). +# prints messages itself, so we have to do the message-printing ourselves +# via AC_MSG_CHECKING + AC_MSG_RESULT. (TODO(csilvers): can we cache?) +# +# tr1/functional_hash.h: new gcc's with tr1 support +# stl_hash_fun.h: old gcc's (gc2.95?) +# ext/hash_fun.h: newer gcc's (gcc4) +# stl/_hash_fun.h: STLport + +AC_DEFUN([AC_CXX_STL_HASH_FUN], + [AC_REQUIRE([AC_CXX_STL_HASH]) + AC_MSG_CHECKING(how to include hash_fun directly) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cv_cxx_stl_hash_fun="" + for location in functional tr1/functional \ + ext/hash_fun.h ext/stl_hash_fun.h \ + hash_fun.h stl_hash_fun.h \ + stl/_hash_fun.h; do + if test -z "$ac_cv_cxx_stl_hash_fun"; then + AC_TRY_COMPILE([#include <$location>], + [int x = ${ac_cv_cxx_hash_namespace}::hash()(5)], + [ac_cv_cxx_stl_hash_fun="<$location>";]) + fi + done + AC_LANG_RESTORE + AC_DEFINE_UNQUOTED(HASH_FUN_H,$ac_cv_cxx_stl_hash_fun, + [the location of the header defining hash functions]) + AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace, + [the namespace of the hash<> function]) + AC_MSG_RESULT([$ac_cv_cxx_stl_hash_fun]) +]) diff --git a/src/sparsehash-1.6/m4/stl_namespace.m4 b/src/sparsehash-1.6/m4/stl_namespace.m4 new file mode 100644 index 0000000..989ad80 --- /dev/null +++ b/src/sparsehash-1.6/m4/stl_namespace.m4 @@ -0,0 +1,25 @@ +# We check what namespace stl code like vector expects to be executed in + +AC_DEFUN([AC_CXX_STL_NAMESPACE], + [AC_CACHE_CHECK( + what namespace STL code is in, + ac_cv_cxx_stl_namespace, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include ], + [vector t; return 0;], + ac_cv_cxx_stl_namespace=none) + AC_TRY_COMPILE([#include ], + [std::vector t; return 0;], + ac_cv_cxx_stl_namespace=std) + AC_LANG_RESTORE]) + if test "$ac_cv_cxx_stl_namespace" = none; then + AC_DEFINE(STL_NAMESPACE,, + [the namespace where STL code like vector<> is defined]) + fi + if test "$ac_cv_cxx_stl_namespace" = std; then + AC_DEFINE(STL_NAMESPACE,std, + [the namespace where STL code like vector<> is defined]) + fi +]) diff --git a/src/sparsehash-1.6/missing b/src/sparsehash-1.6/missing new file mode 100755 index 0000000..894e786 --- /dev/null +++ b/src/sparsehash-1.6/missing @@ -0,0 +1,360 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2005-06-08.21 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case "$1" in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/sparsehash-1.6/mkinstalldirs b/src/sparsehash-1.6/mkinstalldirs new file mode 100755 index 0000000..259dbfc --- /dev/null +++ b/src/sparsehash-1.6/mkinstalldirs @@ -0,0 +1,158 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2005-06-29.22 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/sparsehash-1.6/packages/deb.sh b/src/sparsehash-1.6/packages/deb.sh new file mode 100755 index 0000000..31b423c --- /dev/null +++ b/src/sparsehash-1.6/packages/deb.sh @@ -0,0 +1,74 @@ +#!/bin/bash -e + +# This takes one commandline argument, the name of the package. If no +# name is given, then we'll end up just using the name associated with +# an arbitrary .tar.gz file in the rootdir. That's fine: there's probably +# only one. +# +# Run this from the 'packages' directory, just under rootdir + +## Set LIB to lib if exporting a library, empty-string else +LIB= +#LIB=lib + +PACKAGE="$1" +VERSION="$2" + +# We can only build Debian packages, if the Debian build tools are installed +if [ \! -x /usr/bin/debuild ]; then + echo "Cannot find /usr/bin/debuild. Not building Debian packages." 1>&2 + exit 0 +fi + +# Double-check we're in the packages directory, just under rootdir +if [ \! -r ../Makefile -a \! -r ../INSTALL ]; then + echo "Must run $0 in the 'packages' directory, under the root directory." 1>&2 + echo "Also, you must run \"make dist\" before running this script." 1>&2 + exit 0 +fi + +# Find the top directory for this package +topdir="${PWD%/*}" + +# Find the tar archive built by "make dist" +archive="${PACKAGE}-${VERSION}" +archive_with_underscore="${PACKAGE}_${VERSION}" +if [ -z "${archive}" ]; then + echo "Cannot find ../$PACKAGE*.tar.gz. Run \"make dist\" first." 1>&2 + exit 0 +fi + +# Create a pristine directory for building the Debian package files +trap 'rm -rf '`pwd`/tmp'; exit $?' EXIT SIGHUP SIGINT SIGTERM + +rm -rf tmp +mkdir -p tmp +cd tmp + +# Debian has very specific requirements about the naming of build +# directories, and tar archives. It also wants to write all generated +# packages to the parent of the source directory. We accommodate these +# requirements by building directly from the tar file. +ln -s "${topdir}/${archive}.tar.gz" "${LIB}${archive}.orig.tar.gz" +# Some version of debuilder want foo.orig.tar.gz with _ between versions. +ln -s "${topdir}/${archive}.tar.gz" "${LIB}${archive_with_underscore}.orig.tar.gz" +tar zfx "${LIB}${archive}.orig.tar.gz" +[ -n "${LIB}" ] && mv "${archive}" "${LIB}${archive}" +cd "${LIB}${archive}" +# This is one of those 'specific requirements': where the deb control files live +cp -a "packages/deb" "debian" + +# Now, we can call Debian's standard build tool +debuild -uc -us +cd ../.. # get back to the original top-level dir + +# We'll put the result in a subdirectory that's named after the OS version +# we've made this .deb file for. +destdir="debian-$(cat /etc/debian_version 2>/dev/null || echo UNKNOWN)" + +rm -rf "$destdir" +mkdir -p "$destdir" +mv $(find tmp -mindepth 1 -maxdepth 1 -type f) "$destdir" + +echo +echo "The Debian package files are located in $PWD/$destdir" diff --git a/src/sparsehash-1.6/packages/deb/README b/src/sparsehash-1.6/packages/deb/README new file mode 100644 index 0000000..57becfd --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/README @@ -0,0 +1,7 @@ +The list of files here isn't complete. For a step-by-step guide on +how to set this package up correctly, check out + http://www.debian.org/doc/maint-guide/ + +Most of the files that are in this directory are boilerplate. +However, you may need to change the list of binary-arch dependencies +in 'rules'. diff --git a/src/sparsehash-1.6/packages/deb/changelog b/src/sparsehash-1.6/packages/deb/changelog new file mode 100644 index 0000000..7786c37 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/changelog @@ -0,0 +1,113 @@ +sparsehash (1.6-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Fri, 08 Jan 2010 14:47:55 -0800 + +sparsehash (1.5.2-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 12 May 2009 14:16:38 -0700 + +sparsehash (1.5.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Fri, 08 May 2009 15:23:44 -0700 + +sparsehash (1.5-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Wed, 06 May 2009 11:28:49 -0700 + +sparsehash (1.4-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Wed, 28 Jan 2009 17:11:31 -0800 + +sparsehash (1.3-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Thu, 06 Nov 2008 15:06:09 -0800 + +sparsehash (1.2-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Thu, 18 Sep 2008 13:53:20 -0700 + +sparsehash (1.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Mon, 11 Feb 2008 16:30:11 -0800 + +sparsehash (1.0-1) unstable; urgency=low + + * New upstream release. We are now out of beta. + + -- Google Inc. Tue, 13 Nov 2007 15:15:46 -0800 + +sparsehash (0.9.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Fri, 12 Oct 2007 12:35:24 -0700 + +sparsehash (0.9-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 09 Oct 2007 14:15:21 -0700 + +sparsehash (0.8-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 03 Jul 2007 12:55:04 -0700 + +sparsehash (0.7-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Mon, 11 Jun 2007 11:33:41 -0700 + +sparsehash (0.6-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 20 Mar 2007 17:29:34 -0700 + +sparsehash (0.5-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Sat, 21 Oct 2006 13:47:47 -0700 + +sparsehash (0.4-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Sun, 23 Apr 2006 22:42:35 -0700 + +sparsehash (0.3-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Thu, 03 Nov 2005 20:12:31 -0800 + +sparsehash (0.2-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Mon, 02 May 2005 07:04:46 -0700 + +sparsehash (0.1-1) unstable; urgency=low + + * Initial release. + + -- Google Inc. Tue, 15 Feb 2005 07:17:02 -0800 diff --git a/src/sparsehash-1.6/packages/deb/compat b/src/sparsehash-1.6/packages/deb/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/compat @@ -0,0 +1 @@ +4 diff --git a/src/sparsehash-1.6/packages/deb/control b/src/sparsehash-1.6/packages/deb/control new file mode 100644 index 0000000..c387952 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/control @@ -0,0 +1,17 @@ +Source: sparsehash +Section: libdevel +Priority: optional +Maintainer: Google Inc. +Build-Depends: debhelper (>= 4.0.0) +Standards-Version: 3.6.1 + +Package: sparsehash +Section: libs +Architecture: any +Description: hash_map and hash_set classes with minimal space overhead + This package contains several hash-map implementations, similar + in API to SGI's hash_map class, but with different performance + characteristics. sparse_hash_map uses very little space overhead: 1-2 + bits per entry. dense_hash_map is typically faster than the default + SGI STL implementation. This package also includes hash-set analogues + of these classes. diff --git a/src/sparsehash-1.6/packages/deb/copyright b/src/sparsehash-1.6/packages/deb/copyright new file mode 100644 index 0000000..725a37d --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/copyright @@ -0,0 +1,35 @@ +This package was debianized by Google Inc. on +15 February 2005. + +It was downloaded from http://code.google.com/ + +Upstream Author: opensource@google.com + +Copyright (c) 2005, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/sparsehash-1.6/packages/deb/docs b/src/sparsehash-1.6/packages/deb/docs new file mode 100644 index 0000000..752adb4 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/docs @@ -0,0 +1,16 @@ +AUTHORS +COPYING +ChangeLog +INSTALL +NEWS +README +TODO +doc/dense_hash_map.html +doc/dense_hash_set.html +doc/sparse_hash_map.html +doc/sparse_hash_set.html +doc/sparsetable.html +doc/implementation.html +doc/performance.html +doc/index.html +doc/designstyle.css diff --git a/src/sparsehash-1.6/packages/deb/rules b/src/sparsehash-1.6/packages/deb/rules new file mode 100755 index 0000000..f520bef --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/rules @@ -0,0 +1,117 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +# shared library versions, option 1 +#version=2.0.5 +#major=2 +# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so +version=`ls src/.libs/lib*.so.* | \ + awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'` +major=`ls src/.libs/lib*.so.* | \ + awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'` + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info + + +build: build-stamp +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs ChangeLog + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/src/sparsehash-1.6/packages/deb/sparsehash.dirs b/src/sparsehash-1.6/packages/deb/sparsehash.dirs new file mode 100644 index 0000000..4f17144 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/sparsehash.dirs @@ -0,0 +1,2 @@ +usr/include +usr/include/google diff --git a/src/sparsehash-1.6/packages/deb/sparsehash.install b/src/sparsehash-1.6/packages/deb/sparsehash.install new file mode 100644 index 0000000..9625860 --- /dev/null +++ b/src/sparsehash-1.6/packages/deb/sparsehash.install @@ -0,0 +1,2 @@ +usr/include/google/* +debian/tmp/usr/include/google/* diff --git a/src/sparsehash-1.6/packages/rpm.sh b/src/sparsehash-1.6/packages/rpm.sh new file mode 100755 index 0000000..a655080 --- /dev/null +++ b/src/sparsehash-1.6/packages/rpm.sh @@ -0,0 +1,86 @@ +#!/bin/sh -e + +# Run this from the 'packages' directory, just under rootdir + +# We can only build rpm packages, if the rpm build tools are installed +if [ \! -x /usr/bin/rpmbuild ] +then + echo "Cannot find /usr/bin/rpmbuild. Not building an rpm." 1>&2 + exit 0 +fi + +# Check the commandline flags +PACKAGE="$1" +VERSION="$2" +fullname="${PACKAGE}-${VERSION}" +archive=../$fullname.tar.gz + +if [ -z "$1" -o -z "$2" ] +then + echo "Usage: $0 " 1>&2 + exit 0 +fi + +# Double-check we're in the packages directory, just under rootdir +if [ \! -r ../Makefile -a \! -r ../INSTALL ] +then + echo "Must run $0 in the 'packages' directory, under the root directory." 1>&2 + echo "Also, you must run \"make dist\" before running this script." 1>&2 + exit 0 +fi + +if [ \! -r "$archive" ] +then + echo "Cannot find $archive. Run \"make dist\" first." 1>&2 + exit 0 +fi + +# Create the directory where the input lives, and where the output should live +RPM_SOURCE_DIR="/tmp/rpmsource-$fullname" +RPM_BUILD_DIR="/tmp/rpmbuild-$fullname" + +trap 'rm -rf $RPM_SOURCE_DIR $RPM_BUILD_DIR; exit $?' EXIT SIGHUP SIGINT SIGTERM + +rm -rf "$RPM_SOURCE_DIR" "$RPM_BUILD_DIR" +mkdir "$RPM_SOURCE_DIR" +mkdir "$RPM_BUILD_DIR" + +cp "$archive" "$RPM_SOURCE_DIR" + +# rpmbuild -- as far as I can tell -- asks the OS what CPU it has. +# This may differ from what kind of binaries gcc produces. dpkg +# does a better job of this, so if we can run 'dpkg --print-architecture' +# to get the build CPU, we use that in preference of the rpmbuild +# default. +target=`dpkg --print-architecture 2>/dev/null` # "" if dpkg isn't found +if [ -n "$target" ] +then + target=" --target $target" +fi + +rpmbuild -bb rpm/rpm.spec $target \ + --define "NAME $PACKAGE" \ + --define "VERSION $VERSION" \ + --define "_sourcedir $RPM_SOURCE_DIR" \ + --define "_builddir $RPM_BUILD_DIR" \ + --define "_rpmdir $RPM_SOURCE_DIR" + +# We put the output in a directory based on what system we've built for +destdir=rpm-unknown +if [ -r /etc/issue ] +then + grep "Red Hat.*release 7" /etc/issue >/dev/null 2>&1 && destdir=rh7 + grep "Red Hat.*release 8" /etc/issue >/dev/null 2>&1 && destdir=rh8 + grep "Red Hat.*release 9" /etc/issue >/dev/null 2>&1 && destdir=rh9 + grep "Fedora Core.*release 1" /etc/issue >/dev/null 2>&1 && destdir=fc1 + grep "Fedora Core.*release 2" /etc/issue >/dev/null 2>&1 && destdir=fc2 + grep "Fedora Core.*release 3" /etc/issue >/dev/null 2>&1 && destdir=fc3 +fi + +rm -rf "$destdir" +mkdir -p "$destdir" +# We want to get not only the main package but devel etc, hence the middle * +mv "$RPM_SOURCE_DIR"/*/"${PACKAGE}"-*"${VERSION}"*.rpm "$destdir" + +echo +echo "The rpm package file(s) are located in $PWD/$destdir" diff --git a/src/sparsehash-1.6/packages/rpm/rpm.spec b/src/sparsehash-1.6/packages/rpm/rpm.spec new file mode 100644 index 0000000..f412efe --- /dev/null +++ b/src/sparsehash-1.6/packages/rpm/rpm.spec @@ -0,0 +1,61 @@ +%define RELEASE 1 +%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE} +%define prefix /usr + +Name: %NAME +Summary: hash_map and hash_set classes with minimal space overhead +Version: %VERSION +Release: %rel +Group: Development/Libraries +URL: http://code.google.com/p/google-sparsehash +License: BSD +Vendor: Google +Packager: Google +Source: http://%{NAME}.googlecode.com/files/%{NAME}-%{VERSION}.tar.gz +Distribution: Redhat 7 and above. +Buildroot: %{_tmppath}/%{name}-root +Prefix: %prefix +Buildarch: noarch + +%description +The %name package contains several hash-map implementations, similar +in API to the SGI hash_map class, but with different performance +characteristics. sparse_hash_map uses very little space overhead: 1-2 +bits per entry. dense_hash_map is typically faster than the default +SGI STL implementation. This package also includes hash-set analogues +of these classes. + +%changelog + * Wed Apr 22 2009 + - Change build rule to use %configure instead of ./configure + - Change install to use DESTDIR instead of prefix for make install + - Use wildcards for doc/ and lib/ directories + - Use {_includedir} instead of {prefix}/include + + * Fri Jan 14 2005 + - First draft + +%prep +%setup + +%build +# I can't use '% configure', because it defines -m32 which breaks on +# my development environment for some reason. But I do take +# as much from % configure (in /usr/lib/rpm/macros) as I can. +./configure --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir} --infodir=%{_infodir} +make + +%install +rm -rf $RPM_BUILD_ROOT +make DESTDIR=$RPM_BUILD_ROOT install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) + +%docdir %{prefix}/share/doc/%{NAME}-%{VERSION} +%{prefix}/share/doc/%{NAME}-%{VERSION}/* + +%{_includedir}/google diff --git a/src/sparsehash-1.6/simple_test b/src/sparsehash-1.6/simple_test new file mode 100755 index 0000000000000000000000000000000000000000..e2b9a84d1097a0e5430ba521343a87915d2c9a6f GIT binary patch literal 546143 zcmeEv4PabVmH(ZWnIx?drzMo2QD>6ZB#;2pHel4OJIx2QQrXZ3=(~O`yf? z>d+R58Z!YR*0t_t^HCyXGie*3yIUZZs@+}IEq~F)wd+PcyUMQB?P7In=l}cNkIb9N z_kFf<#Z@ksOPD`Pqzm3Pe<&!5@p)t{O{956Rk84i zIif%m;!4GH{#GnlCMbNUz{`VYZd@t2s&QZK3d$=J_q_NU9`mnxExxS9@4T|`fERyv zl)+t4UI)J961>g4&MOVi*?!f_t&K(|v^zP|C&+spB#;j)&Emj%S@F0t29 zOnuEOmt%P#PvPapeD%3mf8LGH43s?f!Jv32K0}u*l`ythL5YhjZ%~f;SZYwr#qYmB z`FG&ci)#UJEOwWP3-FzPDY(42pNG$Gvov2l)6wY00NRV9mUzc`MU^T&eJz5^=A;D@51#N zT+46~*Eiz&0IpBqT7~P6aeW@wyKxob+K9{fSD|mnZ~XfZuFK>%^$+>f{QV)m`~j{_ z<^etz;|l2e_u%u-aFIquxPTi063D*~>rZ}w7Gj~kzg~ax<9)cwaNUpVZd}R!w&;hK zJAT}O@1%hb*A=+^?RH$Nab2gM-m5>!2mHHFeF)NWj{e?>Px8gbaowz+k)Jl>x)s-jxX6F+#nphz z#x>R7R{VI2F0fvIW;-gZ(BH}TAH;RBzTbw=7X5uGK9}RV1lJ$o`W!Alt~6XFxSW4E zxVZ<{4Y=0e%ENUnt{Pld;o@Hvu20Et>Ys9abl|GSwGLM)F8+NK*PqC56aV=b9$k$K zlTNHn`1u;#S0+6BH12P6JZp7)H(%TIms;}xpLgi*H{r9<@w{Gt|D@v?zozK>yYRU| ze{aX<7jfOG?-M`%H1WX4T@3-pZSpTtIiXm>#?AC9tCr7{~9KF)}f#%vef-oeE9vlL2(lG z`1?09gs6r7;2-7GPjiL1>A!F>BtNBzEsg5tRDZwwQ4%WY_1 z-`7Bx?fObkoY41|Ljdo;Gbk$17u)|R1j=Z0P>}C<|1Gp1aI|mFfjo2Ee-#Sg@P=6X z??roF$M2t@;BegE^G?9i7Zkg6`>k0*oZJx7bO`{Qc7qniYew@qG*UJ>n?800L~(aeo)u+xl-oaYVPj1VCkN4hqh3wwFVJ zr~iET{0aUk`rn|~smF5|&xRfCy$k$zWPPlEH`?9O9u!-3`)e`Ck^7d8~wd@(4xbpPwY zpGEVRisyCtWta$UJ%Cr=590Su;M36aBdM4l{}mK3rKtA*5%}DCA8bqAeiQhmxg{vP z`u_7M=ldtnL*M@?@Z0QwcMsry9`l=I_rr=RMtkYc2E~}}|FgiyjwgcRsD}3sFdvFC zmcpJ@{WoAfwm%mXL5=^+_kf?r0H6MSBkI>W`$M}`j{6Wg4m$4F_@MK*1jRAk|F3c| zzu&oZoW3suUh~JVcYr^-9*B+qOPHT)LqV}ak2iwP(jm+j4c{ir&#te>@N)wATK3OD zF{xBgv#*TLVnp#Oja{y~h#=eU0l=DXK%e=*uQayUkh zzXCkN=+DTLwSL(6QOG-tjr_BS{O+iKC-58Ujq%4<0pHf0!EyQa2#k)C{}5~cv+2O+ zOK4xi--Py#7c7-14ReUQb+BN)3 zP~ZHaYw?eucUw4yKQG49`PCSGe+Yg*<&e)Oz%<>PWAfw^XrtTF-zQMM({Z1M-$RhU zn3j-_?-Wl1AKhPz$&*GDcqRwyD-GXK%+KTh8iV)SfIsAD@88gWv*Ug_+BJVZd~xHS z)xQjiLmHpggFkB>(5PRL=>?^A%k z{m~dbKkJ1)6S3bjpdX&Q7ySbkmj5q|@20uW0()8-X9zPE8s`(mxE%x zh7asI{zrN}o(x7v1wD&E$doZ zn>N*~*;IFH6UwgHi04V4e)Nu-mAZ8K`nr~urWR52@oQJLmaN;@Qd3{o(p0=0J(Vx2 zyd&B33jO@bTQ+XIWqs44MJ>&Bn_8M$>+07xEnl~ywYa3R5_La`-q)<(Sl4>{hL&|L zYjAh#?dx0CEaBsITkx=DO$)~H@oST|v#PbYxo+L2<=3oRSLtjrR{V;_rVTAkHEZiy z*6Oa;VF*iFH!UjWv*qh5E3aKuv#2;$tOh_XU$<&W4My5@+wFDhYg#v=*s3~~Em@9& zt?OFvM6HsVD_1qOUek1E<*F-dR(+tRa?ui0t!cWox%JMPPvP;(YvLfE0E!d(X`#Bc zu6g;ob?hk#SRY)~w7#i9!gB4ZvKU++tXZ`*8C)2h6Q@@y+Dwb3D;(v{98D#+uG>)4 zvhLGOm7fIlW2Aa>p;&aqIxxnj)|w3)H#JFU63OKptipaG=OiOVF(zK)w4`4*Expf} z3nxSG1ok_JFieYF=X^Um+%9%BC1-feI*7Nr){UE%zghDOVyx;KN|6aD#ypc#w!CIl zMa?QT8!M|QTRvJ-KQ-@93w+#UJPYYC8NW=Nj&B-B$=D}BWKBTzx#Z@>x7OWR-&E7G zcGJ2IpHk}1sH2HkN)AXIwa$2MFPZ|92^g7{T#lIo1L2I-%VZ4nmH{*=`_#~i+0-i5 zY-(zndiI@5B7X4JjdwJ`{@QpejEJ(DMN2-0`-+VlTFW;!-&tL`63?g?8`oD!!^&{l zTZhisFkN!QIXUf&ng4?gz>mV)%4;-|#?8XF3_B41fTmKC?AmJ#vEF2{u!KfOP4mW< zb*<|*ZZOuzI5f#@?~+?!t5Q|c1fR+Xn^ug(iMF$lBTJfKINc$dZ*Of8OmVbh5nwE~&R!Y853l0a4Nd88$C4hOp=P}g`z-G+vy zn&vumsa7v_;HE|_DO#II5hoqqT*lTcQFHx<&1CSEO)a)M*8O`A4u;*`U) zMe8@-vaUfrs#uJfxT&db{rZg!qNNp{oK0d)GYryJI89~_O0jODX5*%s#&u1VRd>XR z|Dd|92rCLcEsX8$VX$A(u)e8olTzG<)!w>ExwvUdGwq4GO`GcO zto$VXBp-m(YPw|;T&vQ~soT)HynaRfqRL8A^{qGQ;};rIRn)9+ZCSGzoP3M=d>cSn z+_Jf@8LP$0I9KijIwzMBZ^(jdMtpV-`(O0NvDP_+Qb{zmrk|X*&mjPYQOdw5QViB3 zs{rZ{>HFe9Y#&M9WzsgTSXXF3MJF07{12rqJsa{mG5`wrIk0ymRnI?}1`;0)E z*esyCq6Ys@2i=58=xpj-u1Xdyk)nTGZ?A;3opy1V)Jg3`_JrY_LuNgr5g;xGm%4PX z>rkANSr%U@b^7fMt?S@-Yu&uDrqLNAxbhA}&JZo2Vv1u)C()E4&mbT=fSzh@j#IB^ z+J(0HWV=h8?M`9#Il)TGOK}$9SuAlUGpCJ7p^>HRKqpiRSqX;h3~L!fGTz<4*g2-z zMtPid&&JO!jaqWaL{mKJ6k^fhS+LuZ8V8qsjNDMUs%lmXnAnO0B6xA42$pW=Nd@pk z0?M#97#{Mj60*2j&ajf2l@Q5J=`hWlQR=UFHdX3Y(fXEEFpfY?jZ`-^&INMSH4TJe zRqOcdP2exJl20}$J)%X$F!rTZQgPtQYd;9#tZie0qKcv)L4K}s z@bxTvzf#AXsZiL|_hkiM;>#9e;~Bp#;pd9wW#u(|Qoefi(z4|>i!NKD z9w!A3&R*58YFCl^9;;=(nNM^hp-Yiau(YKiQs4PIN2S_{{i~j&=-%0ysz=yU1o!75 zJyZm7)z;=ClQdO4rJq&h-HD7+xA=Q~?_IYJnW-t_S)E_Wmbl-K_4)VR$ftk|kNBZ3 z-+J-=$V|4xE4sWYh1_7|9;YBF^cX+GDi=AWQ;6?i|6|Jirqtx0DI&Wx>$P3^{;{v5 zj76Ww_lg6NZ1Gei3!g4AkAxNFC?oQA;j}~dhM&2sE$kHo zkxbD8c%O)L-}RNSfh!svM~?Br9rjy2U=I-=)dM*leC84r zb|}j&3cXe0f1<%mf7T|Ey=|MsSDFZV!83ODwy%WCg}apX4}58d&H8+<;3@A0tYN?! z2CQMgD)CkTypblP7so?-aSX$E#oA_@!@x(m@RYJ$w!eCyU$)QRM*Fu(xYGd#VSNc@ z`RNwE^GEx4*osCzNh5yeZ%&%AfAFlGCboGALy8DxMx$2oT+su(xJy}T=--mp7cX#hed_U#h6OlaR*~>P9P@t7`|>${m(M+>ys-E@-9w(8y!NB|-v7+tEgdhf;H{VjUWIFS>EZjE+Jh+j%>CQjL3{9< z+xCf6J5{9FTipY|eNSW*_-O5X)Hc1L!29*VT% z-tQBxE`0h#fBsH+XcJ_0Bf;`;W&VLuVDAPvN;p8;IEWEz8xLUw|Eigslj0xYK$f>1n-@4E*l%^gIAo6B}K@Onzp0di4A) zE4oEL%l7n!!Do;sO?IKT650Q1uGfOEI#c_ktn>$1cXyclTj)I~d3CL&+AKx6qbS#z z+8-WE-90W_3C~M-eiFYQOZaUC+T!oo?tyTY`|IIM_ru|3o`=Fg(5n=*^ZQ1Hzd(o& zyADaY6VT(Bt6?kB<4D!_LiDy5>t`3b%4MA(c%~FQ<8`Yse@9#`pBIT<=n3~imuRqs z*gjY!`ohERo(DW)hkXh%-4=b|A63UA%8G=>(}24-ybI40@pKA&(CxqzcrOl5AJX+# z01qOq4`rdJ(&F(1o(Q+%cl2kcqs%Up$Eq%X(49 zcJ<|FyM`6LN=8M2OV#YR-B;CU?$4d{=oclAa5!4UT5ANDSV96kYB5Ki(T?~iL* zP#5yP*#(}G&$dh5l$KsDpD%?RU$JPF-CERYvm9m3vZCv4@4a`(d;Z>Bc%$tr{EXe@ z>W*}}z-I-c==YnFFP#0de`mkE?@H)*Pg=RxEw+=V4Yo?45r5d#8J)d?hVB;*k7) zy}R3GJ?t5U=-2;1} zH#~@EPq_Pf54n3IFX7pK=%2%&!87jR$n*Gq6xaQ(Q05pu&DhxQ7hFA%IquS>u$z~P zw9=b^oAgU}*lmUV_On*1w4-<4_^PzEOg-Y`6!1)3$Z-UMa(o;QZO5bNUp|M9<@f-H zv>n;sbmL}uzfV|B8}vD}$LG(?vYjKScMSH@e&8nL?j=1Vz~2Kq-2J$EdY{1eyWP8S z_4ERd;Wqa}xOyUo@Vy=Sywkl0ut0n=#aV3G@OTCGL*8 zAC+VF7X+=@*xmkukS?$6*j;FEG9FX7?v}XTsr#jUDW4bkX4fxhCgCiomG-`&8EKx# z+iah-`On{s&L@3p<8;iZo~>(d_^#(2Tov)V2l`B4{Vg(v{NFZ_?`*d7HdYpyBFi#7asA9V2$}GY^%q^eID5A zX#0?-H+&dn2eB48?0HDdU5t0Y)8FewnM{;9h50dzHJmZ zJO*6#<2&XWo)Kq9P#5b{-1kR-M~T;GJdeF0^CTVZkq(pL5Bg8e6SwZy2mGQUg1_ofcZ z9y+Dw*T?ky>H>~0*E)I-<&7R?J(hp3*3lt+`n}zPbKSJ*_o*_xPd3-VUq&WL7^agA z)Ge8Sf$Iy(3CajLhqRvgf`+9F{IM2rQzkfdzmy4`2|BthXmx3sz&gRU`Owk62|7BY z=M~2y`<#J}{xdBT0>BCF3V*;S=T%lJ)-kC)fU%cwMtrF~53Kj};p*x2K^z6Mk2+j`yxTq+X;JU8QQ1-jGdUXUEq^;%(HgX zU4h>@$BM8vhkb?n-H~OfeXzg!v4-syJ5eT>`k0(^6{&BGZfZlD9K)o1<5Rk62g;Ea z^k1<2+0MCA_#LL|w*ZFF{`;)Yr zf%0C+xWqYe$hBRrm0jXn@G~AP_{-DuGwzNg&XI~mJM4DoR*pASgd}a9YaG&=zjb3R z$?s`Xl;Q8oK!cr_=SKdrZWr#G9rKUn5G#^>`q3j|Mq$K^!iX7#5i<%SW)w!uD2$j< z7%`(TVn#ByR+9EaKIg&LPLE(74M)z?^TDYzS~Z@g(;1(1#dL~l+6MihmU)DUH27hH%=?!FnfG0Nzdk|c z{gak?FGJ2y=B-a6^PYsvV;@HDt%V%>8%?iwicZOA#;2$J)A4>)mXAR05%16Hdi?${ zo~;GmpV7~#BSt6DH-{YhW)S*jz@cvrLpJt7HjY1)=890oL|GIw`V5P zIme)L>NURE-f)uk*yo4?wv(X835Ooe1Z>AaQ$ z7GsFB_~9>QTknLPBux_Q97CPgAZHTCc>J^~pVRlDSSEe(CZZ_B(ZdPF=JI{Lk@Br;Ex`lrEwkqCTSTp+0J-{(%ihz0@gsBW<{+ zE;9P*IOw+v&${s2PJ9yHF2KE0^oCJa(&zdl@KyodAOA+__)a-D;^Pe|<8y;ChrY~q z@cL@SDT3Z_o%jM9JwdgJ%fO z9NoXOPtH~HB>OZx*{=I+OX%}@(2sp)X&dkL)5;#q*7v_SeVy#*yx&;T9`r%3oYFA- zRKt)q4Ge1BSPweJ{S7U9e{f2T^_V@Rn$xQ_dLpt=->V|Nt>mRyKdcPEyl?QNyENIOYWmprGcf3>E0vVzrZ!YYAzc-{}xA5H{a}H&N#n=SOcQNMp z>u3=1s%`dBS8wEb#%v2hBIxo+dIofSzSI?zJXWOF%_aK&C}O9@@|lX+mPlPPv6$?rj>*n-8F}JfFk)h| z1;Xk{STm`(UcBwFAGl&2;_65=9#_u*pQMYy)nR>)F~{NRAZ(m;;9bGi3tIHG8`xfx z>$yG|FJ?clU_Q`q_@^^~?FT4J_`ow*C#rVMI`Km%jm^Zi4`p_u?JG{Q?NR6jXFM}` zEV>KrvQB}l6GH5q_q!vuZbQYsQ@$jG`-`T}mFP1Ac^M}5eJ#s^-~TW={o2&TzL&~6 zA)J#r5dH|h6TghnC+qLUUz+|7Wv&OT|Ncw%H?#4X{{Ek=6G9#XWAD2o-_dQ5C;cHj zhc4in!>KC>Q_!&n@nfDbe&{dgw*CV-P?EPxR6NJ%O|EHy`;xJC833-WLkqcjiCH)o6 zqCV4)vDdZqHvT}1yh@z4HDTXI~mwKhVo5hg^&6XXHm>kShY*8NEouoZ+9T_9&(8K+CPZo4=9 z0&vZ~Dck-DI$O&unJ2&=IA@PK=9ZbWdry<^)SRUp9ipv-IXgFDEs{*0{1wVl{wf(f z9QjLKSMkrNgMY>(oKD+|Yf7i>HTHRBdwqj#fQM8YwbnPaZRRh*_#HGOUb>KP;s?zP zjUh87jWe_^af=*D+YZPwKVq7)O~}^f@irA---NY*DSM~(L1s93dAa7`VfY;2XYFbaE|bTafAyi@UnDStrgBqwbi$J}5a-vdp^=SD`g7OA$(TsiPX z)z&|v9LvwaCu#b#-{3O~TFm(4@T*zpbdpX2K7H6eToXBMwIbNbL%&viI-l>v8fQR1 zCk~93W=*GNy6>HB>E%$CM}Qt+!DXL!zWPIi#U@r7C#2KiU2?G6~UMu2zdH&acn)X zr*_k(VvcRN3Ni$F(tvj_#=9?k9I^Oih{>!#EPl+>8(D^O0{%5O);`BPyCZJI4G9;= z`x0XDD^R8iWl9h$d=0VqQp5_6BNl%Ov3QaCcq9Y$nAcW~7-22O2>yrwM-pclslCX9 z>%)D21bCF|w{*k@CEuQ9&PoN^n+kuFU8Gx3_sbk=)$iHmtV~BYL#x@u;!nX3Og>0^ zJtXJOQNYc6=lm3UUYS_D91G+N=PdcxS=Oax73XXH|6tzgypsQ=?n52(C-)HO{Sw94 zFA)%rMvBBpq(JOLt~K)N#UAVjQF}pH&)?P!`||7U=^_kA;zR8jqNCj>zSwSyjE({^ zwT`c6X-_F&P{Bt^oS7NSxo1A^P##9PA588_E>vL+K*5 zCqsDfc{x5W8}bSFkS$X1c_}`Nh6;o=SonHCNB9&+!k}XqbPR)z z*ej!b`Ffws;WMOrx)|u3BRV=WKzA?bZiDVwA|JFZ1pT|(vozf^u?B??x`R6323-n3 z_c@}!lXOoP={;GXJ?TA1czQBL>d+i<8EEgu7*mEaKzA?bZfm;RpnE3ho&~xWfbK=0 zdlA|VfHno7dqC5@0CX=xeVBJBqv#&cba&8E$?Iw8o|Qm%-wf$a{&*wl?gLFH;}b*o z>>1Mi;fGU7A9=W;_#)8@5pYjCg14gVq7*nwuv2MX3UUJ~1obo5sJY0`jz;?f2az-2 z4;+#?_-^rZXPW2_&=z$gr`JX<0rxZ&!e@6b+y1?rLLTrm{OaKE-zhmYs^wHE^iv7+ zQ!(^Y0Q#v2`l$f=$xhHuUhxI!o-kz7AaqOzbkv-Vbn!*Vtj|OC4B$Qoaw-optE)X5 zvMOCXgx`8Qv*2gShF*e9gRV)345H4t44)T6_M}2qr9qAt;`36-u1BC3BUrPf;JX{L z>yn;q=&vlusBFlnOmR8n&-su=lzZurQ)#$zJBp>;vLM42;CRNfXC=L$q$sJlgSZ2H+qY5PU*`xMsGp(PueeN8fM>=aV5}Opl=xT z4THX6&^HYFLVqc}6@=c3Mh60v1#^UT>HE0`#~#aHMy-X>Xj$OkGVVOiS-3THFLLX) z$^BID<952RN5P-iI9Wsqwrwh-Go-B~HF zC~_Wb!~_!SQr@vY_VeFd}Au2JB1G?1$B2_BU6DF}kYts(4LL(IeOkUllcg=10W z!}f@7xxN5hAsZQ+=oxg2-obRtk(1Fw@N@Lrvw>qOd?$|ce9)TXB=I@)n0PKP%y)CY%3W|q%YgKfWByq5j+Ll^4+y%MIJfl+@-NO zJSOL`b8nCNtyIUa?GL?b{~dh7gp;_SpVP#yxgRLYQI2^0Ta+aZf2`M`gmW}bk3SwM z7LP@yT5lru*6!~PVGkAdQiZzl?qZB(|0wKC3pQ*SY*@>}n}9pK;OMe>`0BSr=pswx zW;NnUu^30r9oPohye{AmJxc%lrFb*wgPSqmupc(>m(d)hHv-ff|6p$owT1m9Xr|!v zz?9J&IDTPVZ@d7#aX0kF)qzoOsyG?VU6@P#;G1i?F@K`bdgu?2&AM*vD~67+X&)a9 z%t7v!y~yviT>j2f%Uy6c+Aj|wkMjO#bYFn_#r8db_b-RM(dcaf%!Q7S4|~J1Dp0Rh z>K7qi=pg+7%b*Y`^1HvF5%=3VykbX(-+MjcmgQZg;9b8Q{~geC-Izz)p;sS=PJIkI zb@DYKb!#F`t2IqeefU)wqdCu`Xxa^$k_Mc^h}-AU2RuHPVLZ$gX%DLTV+|F0^R0J* zZiL(=(t(?lj$H3CjMM^r^}x}~cy?8L$d`ui4*?gApm)ASAFvQ>2H6(!9`1LE7wv`K zdf>UN$KYo!WFv93KU#~}g%Agf&%^6;k(Rrtn?cWsGAjOzi)eHhYaB1&*(Us*A>ce^ zF=zw3foq(4tZ^zp8}MEm^pCJE!<&gamPj6|01sJt()I|Fhvq2T1F-l5pTmd^4^3)& z_w_NkkbQG0tarujm};20lJ@t=F3 zU)->#!It=&i?}N9F^6G;yHUmiz2(^Ni@EiBv{&vKr948uqUDswiDP7}hxs;D6>5xK zh{2E#)4`v{cR$(K-e`H*w|r*ulI6~oyj=YT$xFnmlFG|NZ?U{Aa>&b3%FB`p*h^!Q zhuu#MNWb zG1#3cyZ=tldq3nRY5M29f0N~=TpPVfa#P`Pc5-vss^oH$aG#Cbq}^@gri_=LrQDQb zJ43m7w0df}Ipz8ex**i%5wvgR8V&m$DSPLGkLh=S{~kWzln$x03T}gKQx7HJ?(m2v zsSAW?#5$zG{!O$OdLJtn$a|;Hn(M(tc~6^@`_H>Rq2T^F_Mx-Sm%zVlW1`-Vtx4xV zw^Dy$e^4gZVu@{!=(d|{RNIU}vu!tgI8Z~7C5?!AJQdD^ZQz1Uoe1kxeIrjo_MNHw zHaZo1ljNQUrQ?N2Y*WFg_TMv(&9R5-6nu*jhHt*?wC#>bOhIOWRs%}tl zJfY!Gw5APP4@xw`r$+jp8NOx;L&>KU4Br^X#o5zJ`YymHqu_0>$(+2s0KCn(R1wBj z0N$2!kG$=xhi#*BZ#`V+;g93bL>cHF@cDMV-tL<G-z_6G9$*3GKzw=1tR zSA+O}t9iZePZb=7*A?y0J+CwG#K@)e9SVjs;q_$xg1576&v6^up850S0pxtH!S%AnIb*DSuw&UC;SKrRkZ%XV7bny8uve9yuTRkPDmR@v zA-SI8K8m!`*R-B9F#K4SW^4(10=TcR*JlhBql4jxUL)Ls0@9Ml~IZ;`EYR>!odPxK1*7 zHgFj{KN&|CWv>`InzDwD#%D7bO-y-1lYel~}{&{DbCg=K9iyTi+??26%#>fDdu35yY|fg%f=> z0ob+3sl{4O@GMkqD{#Ix;FutNc*IJ5vSbryCQO8HY7dT_H@DAI*lQFyt zArH%>?3|-*amANP?;>_(QRfrKw0DVPTa z7vR5?zh~+8g*YhX=%so;T>*Y~iI%)V_&QTCkNw_O>t8W`yZd^_8YQjNmbs^+)=K#C z2v6xPui7k2m?#%x<n4$rsbdoZR9*_@b5E^^2VOj0aFhP-cu2UN7_MC+-8;EcbyR zLt5elHkF+7I71ryJ-U!8i+p(E6fy%cdr{s`qu0UjdfgD`$xLH7 z1_omT(!aqrjSPPcI>wK^HBxUl^5Ajifs`Gl+zaFWgBX1OrsXkU>i9n99^0j#BYy5p zkK-!Q^8oP*zdz)_J%c%rbLryVL7#X9wrLF4W%y29r|)p?x!G(F-gyJ$&2<{rITF|O zoj7sLb&*pSxc@{#OuFl z`AWE*xQ@@++ylL*&h!r8JYYBE8RMkyft^X4r`Tbm`>;pEhrPDu+@2hqT}%IS5%QAY z!|33?l2Pn2@t0f;!s09;JoE>yQn>{_pT#^w_=gdHIRH7m2XZ==OG-IfAa<*BJ_85G z&*|kEy^02-V(R+zpQP$sh4}gs4)i~hcF2n}u?b`GA#n|L_D%d;rfL#hC;u02~_KNywDkQX0Fn`CRYjZ!guI+;R=_E zIj=&zkouP~=X%S;oEdAz>t*(4GKZiL-)%qfUQ zn*+Jsh!wYuh=V(k!7kj3{RK;aaPq=7@J27d1jW6k_mV97Oh#Q}I z{NrLBH@;rSje7zA#JI7{3(#?6MaMGNOm&K)(S^`~YE4cW?O*vS==8EYxAw>GRPf(H z$XDbLwpD|_mH;NT2C}^?#VF!YtZQs(6^nj3FEOU_IB3c_lgJY$4}pDB4ve8c_VobD zlWxS_=%oBGvo%7@7Ob|}rd%H&*M#c>JG9+;xUe@eh65MecPdG$NE97$+?DDR@847>or7o z6>Y_Uv;z+7I_#6MIQz_ieM0>I5ITzb(T6KV4(vmwJeAd?`ch3FKGXfKfG76n){=VP3? zun#=A>cMkn?c5{xqciuxkC@8&ST8Syt&*7Ma316+{R&g%Ihb{`$#Y;k#uq{RhyI4K z&sW>;2CRgSYfS!YdHxhguS58D8MpFN=aPsBIR zZfBn($aS17uOt!QUmu5a2llNf+iRxuobrqQ zU2_IZqJNir*9mW8dG0Iaygb&XSf0%Kr##?R2bp2qV@l9WTrLgV>sb>mbVi zSX^_mK9sM5?Iy-GkG#d>CLKBMvAfRgxD#VsGaWZ17wCJRoa-4l8;t8Km0RlW;2a~L z;SaW*H;;5W84XAujaf$_uM=m2_+)Ok^2s}CUH2wtOJ)lpw@xj9IU}AVauiH zbs%#^E9E-yqm;Xy%I)I@f>)^&0Rh z?pMJY5T~5N?(q8x^%`)cV+~lAWDRIz4fwQN1IFmx>+<{hTwH_2)_^wFfPIK7IM;yF zpCLAJ4Y+U!QI8p}0T;%t0V!wA8gMwQ=>03XzG#;=r(6R9|Ks!q-Y9>57uJAs-xBBj ztaFEFzXnwE_UzVx>yb-*wrjw|eB|lYfb5g{EO8A;+&R~P@v-vcwh`A^T<4kmE7~bO zaUa$|CjZQ-1C_2@E%zgt^^i}lm5^^K?YN+f#rf3w3}+h%oRgdZpC0vX9`f3`R&j~? zqKW+ayR$}>I5>xE)Yjm{H7fh0ar4`-My=8@>p{e<2gH*&+wbv6H{zGO5Wn1s7S#7}pfympZS2=kEIDyASmFp78Hy zX`e57knhU89e!W>f*Tz;^NFTByjL&mLwwFB8j+{h3V-ZyxCrH!!H3H=X@%&;`RcWz zS;jzAoSbb20dEyxT>)5Y;WxesV_1!=8h#UB;b!FG-)vtd4$1j}HLLX1n|In_-44CT z_p_<_gP1q&)f(&)jETRQw)yTQ#wcp>-aq)7VCz1OIL#s8;G4)T{1*IAFATbo=bbKI z!hX7!2VajK&h&~`>6b#D=4cOp2hQQc9<_k?Fz_A*-f_n0qha7Z47}sa$GtdPbWa#~ z$69MFWf(Ru#xHs6NOYUDm%kJ3l%Ir)aoH6Z>oU|MtUT|?U!Y?vi2KCi@uMlkRRw4P zyoBeG)MN$awnrz^80{Z z7wwR;r&h}zC6^3d4W73E&-4%Dey9NcexGR0^CS1%U!Y|cc!zM($3*@x@23cWUy6YT zTWrRf_x6qe@KpjFl>%4m!5^$c9%%$Gv;r^9;Dxoo%MS2E2>iVj*B0iMt6~LQDLX+O=<>`XfpY zw&;C4BCc%gJzWP9%5Oz^@&n-{FYuf(^20=(G<_V8dNW<_Ar)c;{Eu97B6ex}@tv_W z@K4L!w|E0hn{0uI`)$Rx{^m(7VqpEFK6PWX5XsuEhsp}P`VJi z>8E0zJkL&@i+gm0=Q%?^0S^43piq7wAAINW`@LiMi22M$KdNw1sdM|;wmEt}4t+0q(�X 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≦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 z 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