diff options
| author | Robert Schumacher <ras0219@outlook.com> | 2020-07-08 18:07:50 -0700 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2020-07-10 18:09:28 +0200 |
| commit | 8d5eed3c82fa6f59c4f9d860f1d5c6bbdd837d80 (patch) | |
| tree | 83592486674c564be7fa8cec6a45b6ff9c042fad | |
| parent | 2b88ce521dbdb9bbac2c89d8fa2e23e7270d1723 (diff) | |
Convert Fl_Group::array_ to union to better represent its behavior
Amended by Albrecht:
- rename union member variables as discussed
- add comments to new array_ union members
Fixes #96
Signed-off-by: Albrecht Schlosser <albrechts.fltk@online.de>
| -rw-r--r-- | FL/Fl_Group.H | 5 | ||||
| -rw-r--r-- | src/Fl_Group.cxx | 8 |
2 files changed, 8 insertions, 5 deletions
diff --git a/FL/Fl_Group.H b/FL/Fl_Group.H index 26baf9726..61ae51093 100644 --- a/FL/Fl_Group.H +++ b/FL/Fl_Group.H @@ -41,7 +41,10 @@ class Fl_Rect; */ class FL_EXPORT Fl_Group : public Fl_Widget { - Fl_Widget** array_; + union { + Fl_Widget** array_; // used if group has two or more children or NULL + Fl_Widget* child1_; // used if group has one child or NULL + }; Fl_Widget* savedfocus_; Fl_Widget* resizable_; int children_; diff --git a/src/Fl_Group.cxx b/src/Fl_Group.cxx index 4a614e1e4..769d28600 100644 --- a/src/Fl_Group.cxx +++ b/src/Fl_Group.cxx @@ -38,7 +38,7 @@ Fl_Group* Fl_Group::current_; is added or removed. */ Fl_Widget*const* Fl_Group::array() const { - return children_ <= 1 ? (Fl_Widget**)(&array_) : array_; + return children_ <= 1 ? &child1_ : array_; } /** @@ -473,9 +473,9 @@ void Fl_Group::insert(Fl_Widget &o, int index) { } o.parent_ = this; if (children_ == 0) { // use array pointer to point at single child - array_ = (Fl_Widget**)&o; + child1_ = &o; } else if (children_ == 1) { // go from 1 to 2 children - Fl_Widget* t = (Fl_Widget*)array_; + Fl_Widget* t = child1_; array_ = (Fl_Widget**)malloc(2*sizeof(Fl_Widget*)); if (index) {array_[0] = t; array_[1] = &o;} else {array_[0] = &o; array_[1] = t;} @@ -520,7 +520,7 @@ void Fl_Group::remove(int index) { if (children_ == 1) { // go from 2 to 1 child Fl_Widget *t = array_[!index]; free((void*)array_); - array_ = (Fl_Widget**)t; + child1_ = t; } else if (children_ > 1) { // delete from array for (; index < children_; index++) array_[index] = array_[index+1]; } |
