changeset 2895:5a6bf6bd3001

C++: Divide up C++11 and Lambda support since some compilers can support lambdas without full C++11 support. For instance MSVC 2010 supports lambdas but only MSVC 2017 supports C++11 or higher. GCC 4.5 supports lambdas but GCC 4.8.1 supports C++11.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 23 Dec 2022 04:13:51 +0000
parents 5bbd275369cd
children d91aaffca1fc
files dw.hpp dwtestoo.cpp
diffstat 2 files changed, 34 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/dw.hpp	Fri Dec 23 02:56:29 2022 +0000
+++ b/dw.hpp	Fri Dec 23 04:13:51 2022 +0000
@@ -8,14 +8,20 @@
 #include <dw.h>
 
 // Attempt to support compilers without nullptr type literal
-#if __cplusplus >= 201103L
+#if __cplusplus >= 201103L 
 #define DW_CPP11
 #define DW_NULL nullptr
-#include <functional>
 #else
 #define DW_NULL NULL
 #endif
 
+// Support Lambdas on C++11, Visual C 2010 or GCC 4.5
+#ifdef DW_CPP11 || (defined(_MSC_VER) && _MSC_VER >= 1600) || \
+    (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)))
+#define DW_LAMBDA
+#include <functional>
+#endif
+
 // Attempt to allow compilation on GCC older than 4.7
 #if defined(__GNUC__) && (__GNuC__ < 5 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))
 #define override
@@ -118,7 +124,7 @@
 {
 private:
     bool ClickedConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int()> _ConnectClicked;
 #else
     int (*_ConnectClicked)();
@@ -142,7 +148,7 @@
         return FALSE;
     }
 public:
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectClicked(std::function<int()> userfunc)
 #else
     void ConnectClicked(int (*userfunc)())
@@ -227,7 +233,7 @@
 {
 private:
     bool DeleteConnected, ConfigureConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int()> _ConnectDelete;
     std::function<int(int, int)> _ConnectConfigure;
 #else
@@ -295,7 +301,7 @@
             delete menu;
         }
     }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectDelete(std::function<int()> userfunc)
 #else
     void ConnectDelete(int (*userfunc)()) 
@@ -307,7 +313,7 @@
             DeleteConnected = true;
         }
     }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectConfigure(std::function<int(int, int)> userfunc)
 #else
     void ConnectConfigure(int (*userfunc)(int, int)) 
@@ -511,7 +517,7 @@
 {
 private:
     bool ExposeConnected, ConfigureConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(DWExpose *)> _ConnectExpose;
     std::function<int(int, int)> _ConnectConfigure;
 #else
@@ -560,7 +566,7 @@
     void GetTextExtents(const char *text, int *width, int *height) { dw_font_text_extents_get(hwnd, DW_NULL, text, width, height); }
     char *GetFont() { return dw_window_get_font(hwnd); }
     void Redraw() { dw_render_redraw(hwnd); }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectExpose(std::function<int(DWExpose *)> userfunc)
 #else
     void ConnectExpose(int (*userfunc)(DWExpose *))
@@ -572,7 +578,7 @@
             ExposeConnected = true;
         }
     }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectConfigure(std::function<int(int, int)> userfunc)
 #else
     void ConnectConfigure(int (*userfunc)(int, int))
@@ -652,7 +658,7 @@
 {
 private:
     bool ChangedConnected, ResultConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(int, char *)> _ConnectChanged;
     std::function<int(int, char *, void *)> _ConnectResult;
 #else
@@ -687,7 +693,7 @@
     int JavascriptRun(const char *script, void *scriptdata) { return dw_html_javascript_run(hwnd, script, scriptdata); }
     int Raw(const char *buffer) { return dw_html_raw(hwnd, buffer); }
     int URL(const char *url) { return dw_html_url(hwnd, url); }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectChanged(std::function<int(int, char *)> userfunc)
 #else
     void ConnectChanged(int (*userfunc)(int, char *))
@@ -699,7 +705,7 @@
             ChangedConnected = true;
         }
     }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectResult(std::function<int(int, char *, void *)> userfunc)
 #else
     void ConnectResult(int (*userfunc)(int, char *, void *))
@@ -759,7 +765,7 @@
 {
 private:
     bool ListSelectConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(int)> _ConnectListSelect;
 #else
     int (*_ConnectListSelect)(int index);
@@ -789,7 +795,7 @@
     int Selected() { return dw_listbox_selected(hwnd); }
     int Selected(int where) { return dw_listbox_selected_multi(hwnd, where); }
     void SetTop(int top) { dw_listbox_set_top(hwnd, top); }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectListSelect(std::function<int(int)> userfunc)
 #else
     void ConnectListSelect(int (*userfunc)(int))
@@ -836,7 +842,7 @@
 {
 private:
     bool ValueChangedConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(int)> _ConnectValueChanged;
 #else
     int (*_ConnectValueChanged)(int value);
@@ -861,7 +867,7 @@
         return FALSE;
     }
 public:
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectValueChanged(std::function<int(int)> userfunc)
 #else
     void ConnectValueChanged(int (*userfunc)(int))
@@ -943,7 +949,7 @@
 {
 private:
     bool ItemSelectConnected, ItemContextConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(HTREEITEM, char *, void *)> _ConnectItemSelect;
     std::function<int(char *, int, int, void *)> _ConnectItemContext;
 #else
@@ -984,7 +990,7 @@
         return FALSE;
     }
 public:
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc)
 #else
     void ConnectItemSelect(int (*userfunc)(HTREEITEM, char *, void *))
@@ -996,7 +1002,7 @@
             ItemSelectConnected = true;
         }
     }        
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc)
 #else
     void ConnectItemContext(int (*userfunc)(char *, int, int, void *))
@@ -1014,7 +1020,7 @@
 {
 private:
     bool ItemEnterConnected, ColumnClickConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(char *)> _ConnectItemEnter;
     std::function<int(int)> _ConnectColumnClick;
 #else
@@ -1076,7 +1082,7 @@
     void SetRowData(int row, void *data) { dw_container_set_row_data(allocpointer, row, data); }
     void SetRowTitle(int row, const char *title) { dw_container_set_row_title(allocpointer, row, title); }
     void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectItemEnter(std::function<int(char *)> userfunc)
 #else
     void ConnectItemEnter(int (*userfunc)(char *))
@@ -1088,7 +1094,7 @@
             ItemEnterConnected = true;
         }
     }        
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnecColumnClick(std::function<int(int)> userfunc)
 #else
     void ConnectColumnClick(int (*userfunc)(int))
@@ -1139,7 +1145,7 @@
 {
 private:
     bool TreeExpandConnected;
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     std::function<int(HTREEITEM)> _ConnectTreeExpand;
 #else
     int (*_ConnectTreeExpand)(HTREEITEM);
@@ -1181,7 +1187,7 @@
     void *GetData(HTREEITEM item) { dw_tree_item_get_data(hwnd, item); }
     void Select(HTREEITEM item) { dw_tree_item_select(hwnd, item); }
     void SetData(HTREEITEM item, void *itemdata) { dw_tree_item_set_data(hwnd, item, itemdata); }
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     void ConnectTreeExpand(std::function<int(HTREEITEM)> userfunc)
 #else
     void ConnectTreeExpand(int (*userfunc)(HTREEITEM))
--- a/dwtestoo.cpp	Fri Dec 23 02:56:29 2022 +0000
+++ b/dwtestoo.cpp	Fri Dec 23 04:13:51 2022 +0000
@@ -14,7 +14,7 @@
      int OnConfigure(int width, int height) override { return FALSE; }
 };
 
-#ifndef DW_CPP11
+#ifndef DW_LAMBDA
 int button_clicked()
 {
     DW::App *app = DW::App::Init();
@@ -39,7 +39,7 @@
     DW::Button *button = new DW::Button("Test window");
 
     window->PackStart(button, DW_SIZE_AUTO, DW_SIZE_AUTO, TRUE, TRUE, 0);
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     button->ConnectClicked([app] () -> int 
         { 
             app->MessageBox("Button", DW_MB_OK | DW_MB_WARNING, "Clicked!"); 
@@ -54,7 +54,7 @@
     // add menus to the menubar
     DW::Menu *menu = new DW::Menu();
     DW::MenuItem *menuitem = menu->AppendItem("~Quit");
-#ifdef DW_CPP11
+#ifdef DW_LAMBDA
     menuitem->ConnectClicked([app] () -> int 
         { 
             if(app->MessageBox("dwtest", DW_MB_YESNO | DW_MB_QUESTION, "Are you sure you want to exit?") != 0) {