summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2025-07-07 13:51:36 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2025-07-07 14:55:55 +0200
commitbdde3e5d2bd6df79557e219f3b5f148aa0914390 (patch)
tree910d00a8257c8b8a3f4a3916547328c68a72661b
parent51cca24d04768dc73a8d0317db757a0ed7f69eaf (diff)
Fl_Table_Row: replace private class CharVector with std::vector
FL/Fl_Table_Row.H: use `std::vector<uint8_t> _rowselect;`, remove declaration of class `CharVector` src/Fl_Table_Row.cxx: remove implementation of class `CharVector`, simplify loops (use range based for loops), use resize() to change vector size. Unify copyright year of Fl_Table* headers and implementation.
-rw-r--r--FL/Fl_Table.H2
-rw-r--r--FL/Fl_Table_Row.H61
-rw-r--r--src/Fl_Table.cxx2
-rw-r--r--src/Fl_Table_Row.cxx53
4 files changed, 25 insertions, 93 deletions
diff --git a/FL/Fl_Table.H b/FL/Fl_Table.H
index 99ceb3009..d4a149da5 100644
--- a/FL/Fl_Table.H
+++ b/FL/Fl_Table.H
@@ -3,7 +3,7 @@
//
// Copyright 2002 by Greg Ercolano.
// Copyright (c) 2004 O'ksi'D
-// Copyright 2023 by Bill Spitzak and others.
+// Copyright 2009-2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
diff --git a/FL/Fl_Table_Row.H b/FL/Fl_Table_Row.H
index 93f8b0e8c..28b1d05b4 100644
--- a/FL/Fl_Table_Row.H
+++ b/FL/Fl_Table_Row.H
@@ -1,15 +1,11 @@
//
-
-#ifndef _FL_TABLE_ROW_H
-#define _FL_TABLE_ROW_H
-
-//
// Fl_Table_Row -- A row oriented table widget for the Fast Light Tool Kit (FLTK).
//
// A class specializing in a table of rows.
// Handles row-specific selection behavior.
//
// Copyright 2002 by Greg Ercolano.
+// Copyright 2009-2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -22,8 +18,14 @@
// https://www.fltk.org/bugs.php
//
+#ifndef _FL_TABLE_ROW_H
+#define _FL_TABLE_ROW_H
+
#include <FL/Fl_Table.H>
+#include <stdint.h>
+#include <vector>
+
/**
A table with row selection capabilities.
@@ -49,55 +51,8 @@ public:
SELECT_MULTI // multiple row selection (default)
};
private:
- // An STL-ish vector without templates
- class FL_EXPORT CharVector {
- char *arr;
- int _size;
- void init() {
- arr = 0;
- _size = 0;
- }
- void copy(char *newarr, int newsize);
- public:
- CharVector() { // CTOR
- init();
- }
- ~CharVector(); // DTOR
- CharVector(CharVector&o) { // COPY CTOR
- init();
- copy(o.arr, o._size);
- }
- CharVector& operator=(CharVector&o) { // ASSIGN
- init();
- copy(o.arr, o._size);
- return(*this);
- }
- char operator[](int x) const {
- return(arr[x]);
- }
- char& operator[](int x) {
- return(arr[x]);
- }
- int size() {
- return(_size);
- }
- void size(int count);
- char pop_back() {
- char tmp = arr[_size-1];
- _size--;
- return(tmp);
- }
- void push_back(char val) {
- int x = _size;
- size(_size+1);
- arr[x] = val;
- }
- char back() {
- return(arr[_size-1]);
- }
- };
- CharVector _rowselect; // selection flag for each row
+ std::vector<uint8_t> _rowselect; // selection flag for each row
// handle() state variables.
// Put here instead of local statics in handle(), so more
diff --git a/src/Fl_Table.cxx b/src/Fl_Table.cxx
index d970659a0..b7fb817c4 100644
--- a/src/Fl_Table.cxx
+++ b/src/Fl_Table.cxx
@@ -3,7 +3,7 @@
//
// Copyright 2002 by Greg Ercolano.
// Copyright (c) 2004 O'ksi'D
-// Copyright 2023-2025 by Bill Spitzak and others.
+// Copyright 2009-2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
diff --git a/src/Fl_Table_Row.cxx b/src/Fl_Table_Row.cxx
index 6c7e457f9..849cd0383 100644
--- a/src/Fl_Table_Row.cxx
+++ b/src/Fl_Table_Row.cxx
@@ -5,6 +5,7 @@
// Handles row-specific selection behavior.
//
// Copyright 2002 by Greg Ercolano.
+// Copyright 2009-2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -38,31 +39,6 @@
#define PRINTEVENT
#endif
-// An STL-ish vector without templates (private to Fl_Table_Row)
-
-void Fl_Table_Row::CharVector::copy(char *newarr, int newsize) {
- size(newsize);
- memcpy(arr, newarr, newsize * sizeof(char));
-}
-
-Fl_Table_Row::CharVector::~CharVector() { // DTOR
- if (arr) free(arr);
- arr = 0;
-}
-
-void Fl_Table_Row::CharVector::size(int count) {
- if (count <= 0 ) { // Same state as init() - (issue #296)
- if ( arr ) free(arr);
- arr = 0;
- _size = 0;
- return;
- }
- if (count != _size) {
- arr = (char*)realloc(arr, (unsigned)count * sizeof(char));
- _size = count;
- }
-}
-
/**
Checks to see if 'row' is selected.
@@ -89,18 +65,18 @@ void Fl_Table_Row::type(TableRowSelectMode val) {
_selectmode = val;
switch ( _selectmode ) {
case SELECT_NONE: {
- for ( int row=0; row<rows(); row++ ) {
- _rowselect[row] = 0;
+ for (auto &sel : _rowselect) {
+ sel = 0;
}
redraw();
break;
}
case SELECT_SINGLE: {
int count = 0;
- for ( int row=0; row<rows(); row++ ) {
- if ( _rowselect[row] ) {
- if ( ++count > 1 ) { // only one allowed
- _rowselect[row] = 0;
+ for (auto &sel : _rowselect) {
+ if (sel) {
+ if (++count > 1) { // only one allowed
+ sel = 0;
}
}
}
@@ -184,14 +160,14 @@ void Fl_Table_Row::select_all_rows(int flag) {
case SELECT_MULTI: {
char changed = 0;
if ( flag == 2 ) {
- for ( int row=0; row<(int)_rowselect.size(); row++ ) {
- _rowselect[row] ^= 1;
+ for (auto &sel : _rowselect) {
+ sel ^= 1;
}
changed = 1;
} else {
- for ( int row=0; row<(int)_rowselect.size(); row++ ) {
- changed |= (_rowselect[row] != flag)?1:0;
- _rowselect[row] = flag;
+ for (auto &sel : _rowselect) {
+ changed |= (sel != flag) ? 1 : 0;
+ sel = flag;
}
}
if ( changed ) {
@@ -203,9 +179,10 @@ void Fl_Table_Row::select_all_rows(int flag) {
// Set number of rows
void Fl_Table_Row::rows(int val) {
- while ( val > (int)_rowselect.size() ) { _rowselect.push_back(0); } // enlarge
+ // Note: order of operations below matters, see PR #1187
+ if (val > (int)_rowselect.size()) { _rowselect.resize(val, 0); } // enlarge
Fl_Table::rows(val);
- while ( val < (int)_rowselect.size() ) { _rowselect.pop_back(); } // shrink
+ if (val < (int)_rowselect.size()) { _rowselect.resize(val); } // shrink
}
// Handle events