Commit 48f8b64ae495b64d404c91c8dbb86355e6771505
1 parent
f0032bb6
Implement resize_data() method for all classes (except for Bit columns) and impl…
…ement elements() method for defining variable-length column. A variable-length column is now constructued by passing a negative column vector length. The size of a row is specified using the elements() method that makes use of the resize_data() method implemented by the derived classes. The only column type that is not yet implemented is the Bit column. Also the string columns do not yet work properly for variable-length columns.
Showing
26 changed files
with
898 additions
and
37 deletions
include/GFitsTableBitCol.hpp
| @@ -84,6 +84,7 @@ private: | @@ -84,6 +84,7 @@ private: | ||
| 84 | virtual void alloc_data(void); | 84 | virtual void alloc_data(void); |
| 85 | virtual void init_data(void); | 85 | virtual void init_data(void); |
| 86 | virtual void fetch_data(void) const; | 86 | virtual void fetch_data(void) const; |
| 87 | + virtual void resize_data(const int& index, const int& number); | ||
| 87 | virtual void release_data(void); | 88 | virtual void release_data(void); |
| 88 | virtual void* ptr_data(const int& index = 0); | 89 | virtual void* ptr_data(const int& index = 0); |
| 89 | virtual void* ptr_nulval(void); | 90 | virtual void* ptr_nulval(void); |
include/GFitsTableBoolCol.hpp
| @@ -85,6 +85,7 @@ private: | @@ -85,6 +85,7 @@ private: | ||
| 85 | virtual void alloc_data(void); | 85 | virtual void alloc_data(void); |
| 86 | virtual void init_data(void); | 86 | virtual void init_data(void); |
| 87 | virtual void fetch_data(void) const; | 87 | virtual void fetch_data(void) const; |
| 88 | + virtual void resize_data(const int& index, const int& number); | ||
| 88 | virtual void release_data(void); | 89 | virtual void release_data(void); |
| 89 | virtual void* ptr_data(const int& index = 0); | 90 | virtual void* ptr_data(const int& index = 0); |
| 90 | virtual void* ptr_nulval(void); | 91 | virtual void* ptr_nulval(void); |
include/GFitsTableByteCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableCDoubleCol.hpp
| @@ -81,6 +81,7 @@ private: | @@ -81,6 +81,7 @@ private: | ||
| 81 | virtual void alloc_data(void); | 81 | virtual void alloc_data(void); |
| 82 | virtual void init_data(void); | 82 | virtual void init_data(void); |
| 83 | virtual void fetch_data(void) const; | 83 | virtual void fetch_data(void) const; |
| 84 | + virtual void resize_data(const int& index, const int& number); | ||
| 84 | virtual void release_data(void); | 85 | virtual void release_data(void); |
| 85 | virtual void* ptr_data(const int& index = 0); | 86 | virtual void* ptr_data(const int& index = 0); |
| 86 | virtual void* ptr_nulval(void); | 87 | virtual void* ptr_nulval(void); |
include/GFitsTableCFloatCol.hpp
| @@ -81,6 +81,7 @@ private: | @@ -81,6 +81,7 @@ private: | ||
| 81 | virtual void alloc_data(void); | 81 | virtual void alloc_data(void); |
| 82 | virtual void init_data(void); | 82 | virtual void init_data(void); |
| 83 | virtual void fetch_data(void) const; | 83 | virtual void fetch_data(void) const; |
| 84 | + virtual void resize_data(const int& index, const int& number); | ||
| 84 | virtual void release_data(void); | 85 | virtual void release_data(void); |
| 85 | virtual void* ptr_data(const int& index = 0); | 86 | virtual void* ptr_data(const int& index = 0); |
| 86 | virtual void* ptr_nulval(void); | 87 | virtual void* ptr_nulval(void); |
include/GFitsTableCol.hpp
| @@ -108,7 +108,7 @@ protected: | @@ -108,7 +108,7 @@ protected: | ||
| 108 | virtual void alloc_data(void) = 0; | 108 | virtual void alloc_data(void) = 0; |
| 109 | virtual void init_data(void) = 0; | 109 | virtual void init_data(void) = 0; |
| 110 | virtual void fetch_data(void) const = 0; | 110 | virtual void fetch_data(void) const = 0; |
| 111 | - virtual void resize_data(const int& index, const int& number) {} | 111 | + virtual void resize_data(const int& index, const int& number) = 0; |
| 112 | virtual void release_data(void) = 0; | 112 | virtual void release_data(void) = 0; |
| 113 | virtual void* ptr_data(const int& index = 0) = 0; | 113 | virtual void* ptr_data(const int& index = 0) = 0; |
| 114 | virtual void* ptr_nulval(void) = 0; | 114 | virtual void* ptr_nulval(void) = 0; |
include/GFitsTableDoubleCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableFloatCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableLongCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableLongLongCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableStringCol.hpp
| @@ -82,6 +82,7 @@ private: | @@ -82,6 +82,7 @@ private: | ||
| 82 | virtual void alloc_data(void); | 82 | virtual void alloc_data(void); |
| 83 | virtual void init_data(void); | 83 | virtual void init_data(void); |
| 84 | virtual void fetch_data(void) const; | 84 | virtual void fetch_data(void) const; |
| 85 | + virtual void resize_data(const int& index, const int& number); | ||
| 85 | virtual void release_data(void); | 86 | virtual void release_data(void); |
| 86 | virtual void* ptr_data(const int& index = 0); | 87 | virtual void* ptr_data(const int& index = 0); |
| 87 | virtual void* ptr_nulval(void); | 88 | virtual void* ptr_nulval(void); |
include/GFitsTableULongCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
include/GFitsTableUShortCol.hpp
| @@ -80,6 +80,7 @@ private: | @@ -80,6 +80,7 @@ private: | ||
| 80 | virtual void alloc_data(void); | 80 | virtual void alloc_data(void); |
| 81 | virtual void init_data(void); | 81 | virtual void init_data(void); |
| 82 | virtual void fetch_data(void) const; | 82 | virtual void fetch_data(void) const; |
| 83 | + virtual void resize_data(const int& index, const int& number); | ||
| 83 | virtual void release_data(void); | 84 | virtual void release_data(void); |
| 84 | virtual void* ptr_data(const int& index = 0); | 85 | virtual void* ptr_data(const int& index = 0); |
| 85 | virtual void* ptr_nulval(void); | 86 | virtual void* ptr_nulval(void); |
src/fits/GFitsTableBitCol.cpp
| @@ -723,6 +723,28 @@ void GFitsTableBitCol::fetch_data(void) const | @@ -723,6 +723,28 @@ void GFitsTableBitCol::fetch_data(void) const | ||
| 723 | 723 | ||
| 724 | 724 | ||
| 725 | /***********************************************************************//** | 725 | /***********************************************************************//** |
| 726 | + * @brief Resize column data | ||
| 727 | + * | ||
| 728 | + * @param[in] index Start index. | ||
| 729 | + * @param[in] number Number of elements to add/remove. | ||
| 730 | + * | ||
| 731 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 732 | + * @p number is a positive number, removing if @p number is negative. | ||
| 733 | + * Note that the method does not change the validity of the arguments. | ||
| 734 | + * This needs to be done by the client. | ||
| 735 | + * | ||
| 736 | + * @todo Needs to be implemented | ||
| 737 | + ***************************************************************************/ | ||
| 738 | +void GFitsTableBitCol::resize_data(const int& index, const int& number) | ||
| 739 | +{ | ||
| 740 | + //TODO | ||
| 741 | + | ||
| 742 | + // Return | ||
| 743 | + return; | ||
| 744 | +} | ||
| 745 | + | ||
| 746 | + | ||
| 747 | +/***********************************************************************//** | ||
| 726 | * @brief Release column data | 748 | * @brief Release column data |
| 727 | ***************************************************************************/ | 749 | ***************************************************************************/ |
| 728 | void GFitsTableBitCol::release_data(void) | 750 | void GFitsTableBitCol::release_data(void) |
src/fits/GFitsTableBoolCol.cpp
| @@ -531,7 +531,8 @@ void GFitsTableBoolCol::copy_members(const GFitsTableBoolCol& column) | @@ -531,7 +531,8 @@ void GFitsTableBoolCol::copy_members(const GFitsTableBoolCol& column) | ||
| 531 | 531 | ||
| 532 | // Copy column data | 532 | // Copy column data |
| 533 | if (column.m_data != NULL && m_size > 0) { | 533 | if (column.m_data != NULL && m_size > 0) { |
| 534 | - alloc_data(); | 534 | + if (m_data != NULL) delete [] m_data; |
| 535 | + m_data = new bool[m_size]; | ||
| 535 | for (int i = 0; i < m_size; ++i) { | 536 | for (int i = 0; i < m_size; ++i) { |
| 536 | m_data[i] = column.m_data[i]; | 537 | m_data[i] = column.m_data[i]; |
| 537 | } | 538 | } |
| @@ -644,6 +645,10 @@ void GFitsTableBoolCol::alloc_data(void) | @@ -644,6 +645,10 @@ void GFitsTableBoolCol::alloc_data(void) | ||
| 644 | m_data = new bool[m_size]; | 645 | m_data = new bool[m_size]; |
| 645 | } | 646 | } |
| 646 | 647 | ||
| 648 | + // Allocate also buffer | ||
| 649 | + free_buffer(); | ||
| 650 | + alloc_buffer(); | ||
| 651 | + | ||
| 647 | // Return | 652 | // Return |
| 648 | return; | 653 | return; |
| 649 | } | 654 | } |
| @@ -660,16 +665,7 @@ void GFitsTableBoolCol::alloc_data(void) | @@ -660,16 +665,7 @@ void GFitsTableBoolCol::alloc_data(void) | ||
| 660 | ***************************************************************************/ | 665 | ***************************************************************************/ |
| 661 | void GFitsTableBoolCol::fetch_data(void) const | 666 | void GFitsTableBoolCol::fetch_data(void) const |
| 662 | { | 667 | { |
| 663 | - // Calculate size of memory | ||
| 664 | - m_size = m_number * m_length; | ||
| 665 | - | ||
| 666 | - // Free old buffer memory | ||
| 667 | - free_buffer(); | ||
| 668 | - | ||
| 669 | - // Allocate buffer memory | ||
| 670 | - alloc_buffer(); | ||
| 671 | - | ||
| 672 | - // Save column | 668 | + // Load column |
| 673 | const_cast<GFitsTableBoolCol*>(this)->load_column(); | 669 | const_cast<GFitsTableBoolCol*>(this)->load_column(); |
| 674 | 670 | ||
| 675 | // Extract values from buffer | 671 | // Extract values from buffer |
| @@ -686,6 +682,73 @@ void GFitsTableBoolCol::fetch_data(void) const | @@ -686,6 +682,73 @@ void GFitsTableBoolCol::fetch_data(void) const | ||
| 686 | 682 | ||
| 687 | 683 | ||
| 688 | /***********************************************************************//** | 684 | /***********************************************************************//** |
| 685 | + * @brief Resize column data | ||
| 686 | + * | ||
| 687 | + * @param[in] index Start index. | ||
| 688 | + * @param[in] number Number of elements to add/remove. | ||
| 689 | + * | ||
| 690 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 691 | + * @p number is a positive number, removing if @p number is negative. | ||
| 692 | + * Note that the method does not change the validity of the arguments. | ||
| 693 | + * This needs to be done by the client. | ||
| 694 | + ***************************************************************************/ | ||
| 695 | +void GFitsTableBoolCol::resize_data(const int& index, const int& number) | ||
| 696 | +{ | ||
| 697 | + // Continue only if number of elements is not zero | ||
| 698 | + if (number != 0) { | ||
| 699 | + | ||
| 700 | + // If data are not available then load them now | ||
| 701 | + if (m_data == NULL) fetch_data(); | ||
| 702 | + | ||
| 703 | + // If elements should be removed then do not allocate new memory | ||
| 704 | + // but just move elements forward and change the logical size of | ||
| 705 | + // memory. Only if all elements should be removed the memory is | ||
| 706 | + // released. | ||
| 707 | + if (number < 0) { | ||
| 708 | + if (m_data != NULL) { | ||
| 709 | + int left = index - number; | ||
| 710 | + bool* dst = m_data + index; | ||
| 711 | + bool* src = m_data + left; | ||
| 712 | + int num = m_size - left; | ||
| 713 | + for (int i = 0; i < num; ++i) { | ||
| 714 | + *dst++ = *src++; | ||
| 715 | + } | ||
| 716 | + m_size += number; | ||
| 717 | + if (m_size < 1) { | ||
| 718 | + release_data(); | ||
| 719 | + } | ||
| 720 | + } | ||
| 721 | + } | ||
| 722 | + | ||
| 723 | + // If elements should be added then allocate new memory, copy over | ||
| 724 | + // the old data and initialise the new elements | ||
| 725 | + else { | ||
| 726 | + int left = m_size - index; | ||
| 727 | + m_size += number; | ||
| 728 | + bool* new_data = new bool[m_size]; | ||
| 729 | + bool* dst = new_data; | ||
| 730 | + bool* src = m_data; | ||
| 731 | + for (int i = 0; i < index; ++i) { | ||
| 732 | + *dst++ = *src++; | ||
| 733 | + } | ||
| 734 | + for (int i = 0; i < number; ++i) { | ||
| 735 | + *dst++ = false; | ||
| 736 | + } | ||
| 737 | + for (int i = 0; i < left; ++i) { | ||
| 738 | + *dst++ = *src++; | ||
| 739 | + } | ||
| 740 | + if (m_data != NULL) delete [] m_data; | ||
| 741 | + m_data = new_data; | ||
| 742 | + } | ||
| 743 | + | ||
| 744 | + } // endif: number was non-zero | ||
| 745 | + | ||
| 746 | + // Return | ||
| 747 | + return; | ||
| 748 | +} | ||
| 749 | + | ||
| 750 | + | ||
| 751 | +/***********************************************************************//** | ||
| 689 | * @brief Release column data | 752 | * @brief Release column data |
| 690 | ***************************************************************************/ | 753 | ***************************************************************************/ |
| 691 | void GFitsTableBoolCol::release_data(void) | 754 | void GFitsTableBoolCol::release_data(void) |
src/fits/GFitsTableByteCol.cpp
| @@ -620,6 +620,71 @@ void GFitsTableByteCol::fetch_data(void) const | @@ -620,6 +620,71 @@ void GFitsTableByteCol::fetch_data(void) const | ||
| 620 | 620 | ||
| 621 | 621 | ||
| 622 | /***********************************************************************//** | 622 | /***********************************************************************//** |
| 623 | + * @brief Resize column data | ||
| 624 | + * | ||
| 625 | + * @param[in] index Start index. | ||
| 626 | + * @param[in] number Number of elements to add/remove. | ||
| 627 | + * | ||
| 628 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 629 | + * @p number is a positive number, removing if @p number is negative. | ||
| 630 | + * Note that the method does not change the validity of the arguments. | ||
| 631 | + * This needs to be done by the client. | ||
| 632 | + ***************************************************************************/ | ||
| 633 | +void GFitsTableByteCol::resize_data(const int& index, const int& number) | ||
| 634 | +{ | ||
| 635 | + // Continue only if number of elements is not zero | ||
| 636 | + if (number != 0) { | ||
| 637 | + | ||
| 638 | + // If data are not available then load them now | ||
| 639 | + if (m_data == NULL) fetch_data(); | ||
| 640 | + | ||
| 641 | + // If elements should be removed then do not allocate new memory | ||
| 642 | + // but just move elements forward and change the logical size of | ||
| 643 | + // memory. Only if all elements should be removed the memory is | ||
| 644 | + // released. | ||
| 645 | + if (number < 0) { | ||
| 646 | + int left = index - number; | ||
| 647 | + unsigned char* dst = m_data + index; | ||
| 648 | + unsigned char* src = m_data + left; | ||
| 649 | + int num = m_size - left; | ||
| 650 | + for (int i = 0; i < num; ++i) { | ||
| 651 | + *dst++ = *src++; | ||
| 652 | + } | ||
| 653 | + m_size += number; | ||
| 654 | + if (m_size < 1) { | ||
| 655 | + release_data(); | ||
| 656 | + } | ||
| 657 | + } | ||
| 658 | + | ||
| 659 | + // If elements should be added then allocate new memory, copy over | ||
| 660 | + // the old data and initialise the new elements | ||
| 661 | + else { | ||
| 662 | + int left = m_size - index; | ||
| 663 | + m_size += number; | ||
| 664 | + unsigned char* new_data = new unsigned char[m_size]; | ||
| 665 | + unsigned char* dst = new_data; | ||
| 666 | + unsigned char* src = m_data; | ||
| 667 | + for (int i = 0; i < index; ++i) { | ||
| 668 | + *dst++ = *src++; | ||
| 669 | + } | ||
| 670 | + for (int i = 0; i < number; ++i) { | ||
| 671 | + *dst++ = 0; | ||
| 672 | + } | ||
| 673 | + for (int i = 0; i < left; ++i) { | ||
| 674 | + *dst++ = *src++; | ||
| 675 | + } | ||
| 676 | + if (m_data != NULL) delete [] m_data; | ||
| 677 | + m_data = new_data; | ||
| 678 | + } | ||
| 679 | + | ||
| 680 | + } // endif: number was non-zero | ||
| 681 | + | ||
| 682 | + // Return | ||
| 683 | + return; | ||
| 684 | +} | ||
| 685 | + | ||
| 686 | + | ||
| 687 | +/***********************************************************************//** | ||
| 623 | * @brief Release column data | 688 | * @brief Release column data |
| 624 | ***************************************************************************/ | 689 | ***************************************************************************/ |
| 625 | void GFitsTableByteCol::release_data(void) | 690 | void GFitsTableByteCol::release_data(void) |
src/fits/GFitsTableCDoubleCol.cpp
| @@ -630,6 +630,73 @@ void GFitsTableCDoubleCol::fetch_data(void) const | @@ -630,6 +630,73 @@ void GFitsTableCDoubleCol::fetch_data(void) const | ||
| 630 | 630 | ||
| 631 | 631 | ||
| 632 | /***********************************************************************//** | 632 | /***********************************************************************//** |
| 633 | + * @brief Resize column data | ||
| 634 | + * | ||
| 635 | + * @param[in] index Start index. | ||
| 636 | + * @param[in] number Number of elements to add/remove. | ||
| 637 | + * | ||
| 638 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 639 | + * @p number is a positive number, removing if @p number is negative. | ||
| 640 | + * Note that the method does not change the validity of the arguments. | ||
| 641 | + * This needs to be done by the client. | ||
| 642 | + ***************************************************************************/ | ||
| 643 | +void GFitsTableCDoubleCol::resize_data(const int& index, const int& number) | ||
| 644 | +{ | ||
| 645 | + // Continue only if number of elements is not zero | ||
| 646 | + if (number != 0) { | ||
| 647 | + | ||
| 648 | + // If data are not available then load them now | ||
| 649 | + if (m_data == NULL) fetch_data(); | ||
| 650 | + | ||
| 651 | + // If elements should be removed then do not allocate new memory | ||
| 652 | + // but just move elements forward and change the logical size of | ||
| 653 | + // memory. Only if all elements should be removed the memory is | ||
| 654 | + // released. | ||
| 655 | + if (number < 0) { | ||
| 656 | + int left = index - number; | ||
| 657 | + GFits::cdouble* dst = m_data + index; | ||
| 658 | + GFits::cdouble* src = m_data + left; | ||
| 659 | + int num = m_size - left; | ||
| 660 | + for (int i = 0; i < num; ++i) { | ||
| 661 | + *dst++ = *src++; | ||
| 662 | + } | ||
| 663 | + m_size += number; | ||
| 664 | + if (m_size < 1) { | ||
| 665 | + release_data(); | ||
| 666 | + } | ||
| 667 | + } | ||
| 668 | + | ||
| 669 | + // If elements should be added then allocate new memory, copy over | ||
| 670 | + // the old data and initialise the new elements | ||
| 671 | + else { | ||
| 672 | + int left = m_size - index; | ||
| 673 | + m_size += number; | ||
| 674 | + GFits::cdouble* new_data = new GFits::cdouble[m_size]; | ||
| 675 | + GFits::cdouble* dst = new_data; | ||
| 676 | + GFits::cdouble* src = m_data; | ||
| 677 | + for (int i = 0; i < index; ++i) { | ||
| 678 | + *dst++ = *src++; | ||
| 679 | + } | ||
| 680 | + for (int i = 0; i < number; ++i) { | ||
| 681 | + dst->re = 0.0; | ||
| 682 | + dst->im = 0.0; | ||
| 683 | + dst++; | ||
| 684 | + } | ||
| 685 | + for (int i = 0; i < left; ++i) { | ||
| 686 | + *dst++ = *src++; | ||
| 687 | + } | ||
| 688 | + if (m_data != NULL) delete [] m_data; | ||
| 689 | + m_data = new_data; | ||
| 690 | + } | ||
| 691 | + | ||
| 692 | + } // endif: number was non-zero | ||
| 693 | + | ||
| 694 | + // Return | ||
| 695 | + return; | ||
| 696 | +} | ||
| 697 | + | ||
| 698 | + | ||
| 699 | +/***********************************************************************//** | ||
| 633 | * @brief Release column data | 700 | * @brief Release column data |
| 634 | ***************************************************************************/ | 701 | ***************************************************************************/ |
| 635 | void GFitsTableCDoubleCol::release_data(void) | 702 | void GFitsTableCDoubleCol::release_data(void) |
src/fits/GFitsTableCFloatCol.cpp
| @@ -630,6 +630,73 @@ void GFitsTableCFloatCol::fetch_data(void) const | @@ -630,6 +630,73 @@ void GFitsTableCFloatCol::fetch_data(void) const | ||
| 630 | 630 | ||
| 631 | 631 | ||
| 632 | /***********************************************************************//** | 632 | /***********************************************************************//** |
| 633 | + * @brief Resize column data | ||
| 634 | + * | ||
| 635 | + * @param[in] index Start index. | ||
| 636 | + * @param[in] number Number of elements to add/remove. | ||
| 637 | + * | ||
| 638 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 639 | + * @p number is a positive number, removing if @p number is negative. | ||
| 640 | + * Note that the method does not change the validity of the arguments. | ||
| 641 | + * This needs to be done by the client. | ||
| 642 | + ***************************************************************************/ | ||
| 643 | +void GFitsTableCFloatCol::resize_data(const int& index, const int& number) | ||
| 644 | +{ | ||
| 645 | + // Continue only if number of elements is not zero | ||
| 646 | + if (number != 0) { | ||
| 647 | + | ||
| 648 | + // If data are not available then load them now | ||
| 649 | + if (m_data == NULL) fetch_data(); | ||
| 650 | + | ||
| 651 | + // If elements should be removed then do not allocate new memory | ||
| 652 | + // but just move elements forward and change the logical size of | ||
| 653 | + // memory. Only if all elements should be removed the memory is | ||
| 654 | + // released. | ||
| 655 | + if (number < 0) { | ||
| 656 | + int left = index - number; | ||
| 657 | + GFits::cfloat* dst = m_data + index; | ||
| 658 | + GFits::cfloat* src = m_data + left; | ||
| 659 | + int num = m_size - left; | ||
| 660 | + for (int i = 0; i < num; ++i) { | ||
| 661 | + *dst++ = *src++; | ||
| 662 | + } | ||
| 663 | + m_size += number; | ||
| 664 | + if (m_size < 1) { | ||
| 665 | + release_data(); | ||
| 666 | + } | ||
| 667 | + } | ||
| 668 | + | ||
| 669 | + // If elements should be added then allocate new memory, copy over | ||
| 670 | + // the old data and initialise the new elements | ||
| 671 | + else { | ||
| 672 | + int left = m_size - index; | ||
| 673 | + m_size += number; | ||
| 674 | + GFits::cfloat* new_data = new GFits::cfloat[m_size]; | ||
| 675 | + GFits::cfloat* dst = new_data; | ||
| 676 | + GFits::cfloat* src = m_data; | ||
| 677 | + for (int i = 0; i < index; ++i) { | ||
| 678 | + *dst++ = *src++; | ||
| 679 | + } | ||
| 680 | + for (int i = 0; i < number; ++i) { | ||
| 681 | + dst->re = 0.0; | ||
| 682 | + dst->im = 0.0; | ||
| 683 | + dst++; | ||
| 684 | + } | ||
| 685 | + for (int i = 0; i < left; ++i) { | ||
| 686 | + *dst++ = *src++; | ||
| 687 | + } | ||
| 688 | + if (m_data != NULL) delete [] m_data; | ||
| 689 | + m_data = new_data; | ||
| 690 | + } | ||
| 691 | + | ||
| 692 | + } // endif: number was non-zero | ||
| 693 | + | ||
| 694 | + // Return | ||
| 695 | + return; | ||
| 696 | +} | ||
| 697 | + | ||
| 698 | + | ||
| 699 | +/***********************************************************************//** | ||
| 633 | * @brief Release column data | 700 | * @brief Release column data |
| 634 | ***************************************************************************/ | 701 | ***************************************************************************/ |
| 635 | void GFitsTableCFloatCol::release_data(void) | 702 | void GFitsTableCFloatCol::release_data(void) |
src/fits/GFitsTableDoubleCol.cpp
| @@ -623,6 +623,71 @@ void GFitsTableDoubleCol::fetch_data(void) const | @@ -623,6 +623,71 @@ void GFitsTableDoubleCol::fetch_data(void) const | ||
| 623 | 623 | ||
| 624 | 624 | ||
| 625 | /***********************************************************************//** | 625 | /***********************************************************************//** |
| 626 | + * @brief Resize column data | ||
| 627 | + * | ||
| 628 | + * @param[in] index Start index. | ||
| 629 | + * @param[in] number Number of elements to add/remove. | ||
| 630 | + * | ||
| 631 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 632 | + * @p number is a positive number, removing if @p number is negative. | ||
| 633 | + * Note that the method does not change the validity of the arguments. | ||
| 634 | + * This needs to be done by the client. | ||
| 635 | + ***************************************************************************/ | ||
| 636 | +void GFitsTableDoubleCol::resize_data(const int& index, const int& number) | ||
| 637 | +{ | ||
| 638 | + // Continue only if number of elements is not zero | ||
| 639 | + if (number != 0) { | ||
| 640 | + | ||
| 641 | + // If data are not available then load them now | ||
| 642 | + if (m_data == NULL) fetch_data(); | ||
| 643 | + | ||
| 644 | + // If elements should be removed then do not allocate new memory | ||
| 645 | + // but just move elements forward and change the logical size of | ||
| 646 | + // memory. Only if all elements should be removed the memory is | ||
| 647 | + // released. | ||
| 648 | + if (number < 0) { | ||
| 649 | + int left = index - number; | ||
| 650 | + double* dst = m_data + index; | ||
| 651 | + double* src = m_data + left; | ||
| 652 | + int num = m_size - left; | ||
| 653 | + for (int i = 0; i < num; ++i) { | ||
| 654 | + *dst++ = *src++; | ||
| 655 | + } | ||
| 656 | + m_size += number; | ||
| 657 | + if (m_size < 1) { | ||
| 658 | + release_data(); | ||
| 659 | + } | ||
| 660 | + } | ||
| 661 | + | ||
| 662 | + // If elements should be added then allocate new memory, copy over | ||
| 663 | + // the old data and initialise the new elements | ||
| 664 | + else { | ||
| 665 | + int left = m_size - index; | ||
| 666 | + m_size += number; | ||
| 667 | + double* new_data = new double[m_size]; | ||
| 668 | + double* dst = new_data; | ||
| 669 | + double* src = m_data; | ||
| 670 | + for (int i = 0; i < index; ++i) { | ||
| 671 | + *dst++ = *src++; | ||
| 672 | + } | ||
| 673 | + for (int i = 0; i < number; ++i) { | ||
| 674 | + *dst++ = 0.0; | ||
| 675 | + } | ||
| 676 | + for (int i = 0; i < left; ++i) { | ||
| 677 | + *dst++ = *src++; | ||
| 678 | + } | ||
| 679 | + if (m_data != NULL) delete [] m_data; | ||
| 680 | + m_data = new_data; | ||
| 681 | + } | ||
| 682 | + | ||
| 683 | + } // endif: number was non-zero | ||
| 684 | + | ||
| 685 | + // Return | ||
| 686 | + return; | ||
| 687 | +} | ||
| 688 | + | ||
| 689 | + | ||
| 690 | +/***********************************************************************//** | ||
| 626 | * @brief Release column data | 691 | * @brief Release column data |
| 627 | ***************************************************************************/ | 692 | ***************************************************************************/ |
| 628 | void GFitsTableDoubleCol::release_data(void) | 693 | void GFitsTableDoubleCol::release_data(void) |
src/fits/GFitsTableFloatCol.cpp
| @@ -623,6 +623,71 @@ void GFitsTableFloatCol::fetch_data(void) const | @@ -623,6 +623,71 @@ void GFitsTableFloatCol::fetch_data(void) const | ||
| 623 | 623 | ||
| 624 | 624 | ||
| 625 | /***********************************************************************//** | 625 | /***********************************************************************//** |
| 626 | + * @brief Resize column data | ||
| 627 | + * | ||
| 628 | + * @param[in] index Start index. | ||
| 629 | + * @param[in] number Number of elements to add/remove. | ||
| 630 | + * | ||
| 631 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 632 | + * @p number is a positive number, removing if @p number is negative. | ||
| 633 | + * Note that the method does not change the validity of the arguments. | ||
| 634 | + * This needs to be done by the client. | ||
| 635 | + ***************************************************************************/ | ||
| 636 | +void GFitsTableFloatCol::resize_data(const int& index, const int& number) | ||
| 637 | +{ | ||
| 638 | + // Continue only if number of elements is not zero | ||
| 639 | + if (number != 0) { | ||
| 640 | + | ||
| 641 | + // If data are not available then load them now | ||
| 642 | + if (m_data == NULL) fetch_data(); | ||
| 643 | + | ||
| 644 | + // If elements should be removed then do not allocate new memory | ||
| 645 | + // but just move elements forward and change the logical size of | ||
| 646 | + // memory. Only if all elements should be removed the memory is | ||
| 647 | + // released. | ||
| 648 | + if (number < 0) { | ||
| 649 | + int left = index - number; | ||
| 650 | + float* dst = m_data + index; | ||
| 651 | + float* src = m_data + left; | ||
| 652 | + int num = m_size - left; | ||
| 653 | + for (int i = 0; i < num; ++i) { | ||
| 654 | + *dst++ = *src++; | ||
| 655 | + } | ||
| 656 | + m_size += number; | ||
| 657 | + if (m_size < 1) { | ||
| 658 | + release_data(); | ||
| 659 | + } | ||
| 660 | + } | ||
| 661 | + | ||
| 662 | + // If elements should be added then allocate new memory, copy over | ||
| 663 | + // the old data and initialise the new elements | ||
| 664 | + else { | ||
| 665 | + int left = m_size - index; | ||
| 666 | + m_size += number; | ||
| 667 | + float* new_data = new float[m_size]; | ||
| 668 | + float* dst = new_data; | ||
| 669 | + float* src = m_data; | ||
| 670 | + for (int i = 0; i < index; ++i) { | ||
| 671 | + *dst++ = *src++; | ||
| 672 | + } | ||
| 673 | + for (int i = 0; i < number; ++i) { | ||
| 674 | + *dst++ = 0.0; | ||
| 675 | + } | ||
| 676 | + for (int i = 0; i < left; ++i) { | ||
| 677 | + *dst++ = *src++; | ||
| 678 | + } | ||
| 679 | + if (m_data != NULL) delete [] m_data; | ||
| 680 | + m_data = new_data; | ||
| 681 | + } | ||
| 682 | + | ||
| 683 | + } // endif: number was non-zero | ||
| 684 | + | ||
| 685 | + // Return | ||
| 686 | + return; | ||
| 687 | +} | ||
| 688 | + | ||
| 689 | + | ||
| 690 | +/***********************************************************************//** | ||
| 626 | * @brief Release column data | 691 | * @brief Release column data |
| 627 | ***************************************************************************/ | 692 | ***************************************************************************/ |
| 628 | void GFitsTableFloatCol::release_data(void) | 693 | void GFitsTableFloatCol::release_data(void) |
src/fits/GFitsTableLongCol.cpp
| @@ -623,6 +623,71 @@ void GFitsTableLongCol::fetch_data(void) const | @@ -623,6 +623,71 @@ void GFitsTableLongCol::fetch_data(void) const | ||
| 623 | 623 | ||
| 624 | 624 | ||
| 625 | /***********************************************************************//** | 625 | /***********************************************************************//** |
| 626 | + * @brief Resize column data | ||
| 627 | + * | ||
| 628 | + * @param[in] index Start index. | ||
| 629 | + * @param[in] number Number of elements to add/remove. | ||
| 630 | + * | ||
| 631 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 632 | + * @p number is a positive number, removing if @p number is negative. | ||
| 633 | + * Note that the method does not change the validity of the arguments. | ||
| 634 | + * This needs to be done by the client. | ||
| 635 | + ***************************************************************************/ | ||
| 636 | +void GFitsTableLongCol::resize_data(const int& index, const int& number) | ||
| 637 | +{ | ||
| 638 | + // Continue only if number of elements is not zero | ||
| 639 | + if (number != 0) { | ||
| 640 | + | ||
| 641 | + // If data are not available then load them now | ||
| 642 | + if (m_data == NULL) fetch_data(); | ||
| 643 | + | ||
| 644 | + // If elements should be removed then do not allocate new memory | ||
| 645 | + // but just move elements forward and change the logical size of | ||
| 646 | + // memory. Only if all elements should be removed the memory is | ||
| 647 | + // released. | ||
| 648 | + if (number < 0) { | ||
| 649 | + int left = index - number; | ||
| 650 | + long* dst = m_data + index; | ||
| 651 | + long* src = m_data + left; | ||
| 652 | + int num = m_size - left; | ||
| 653 | + for (int i = 0; i < num; ++i) { | ||
| 654 | + *dst++ = *src++; | ||
| 655 | + } | ||
| 656 | + m_size += number; | ||
| 657 | + if (m_size < 1) { | ||
| 658 | + release_data(); | ||
| 659 | + } | ||
| 660 | + } | ||
| 661 | + | ||
| 662 | + // If elements should be added then allocate new memory, copy over | ||
| 663 | + // the old data and initialise the new elements | ||
| 664 | + else { | ||
| 665 | + int left = m_size - index; | ||
| 666 | + m_size += number; | ||
| 667 | + long* new_data = new long[m_size]; | ||
| 668 | + long* dst = new_data; | ||
| 669 | + long* src = m_data; | ||
| 670 | + for (int i = 0; i < index; ++i) { | ||
| 671 | + *dst++ = *src++; | ||
| 672 | + } | ||
| 673 | + for (int i = 0; i < number; ++i) { | ||
| 674 | + *dst++ = 0; | ||
| 675 | + } | ||
| 676 | + for (int i = 0; i < left; ++i) { | ||
| 677 | + *dst++ = *src++; | ||
| 678 | + } | ||
| 679 | + if (m_data != NULL) delete [] m_data; | ||
| 680 | + m_data = new_data; | ||
| 681 | + } | ||
| 682 | + | ||
| 683 | + } // endif: number was non-zero | ||
| 684 | + | ||
| 685 | + // Return | ||
| 686 | + return; | ||
| 687 | +} | ||
| 688 | + | ||
| 689 | + | ||
| 690 | +/***********************************************************************//** | ||
| 626 | * @brief Release column data | 691 | * @brief Release column data |
| 627 | ***************************************************************************/ | 692 | ***************************************************************************/ |
| 628 | void GFitsTableLongCol::release_data(void) | 693 | void GFitsTableLongCol::release_data(void) |
src/fits/GFitsTableLongLongCol.cpp
| @@ -623,6 +623,71 @@ void GFitsTableLongLongCol::fetch_data(void) const | @@ -623,6 +623,71 @@ void GFitsTableLongLongCol::fetch_data(void) const | ||
| 623 | 623 | ||
| 624 | 624 | ||
| 625 | /***********************************************************************//** | 625 | /***********************************************************************//** |
| 626 | + * @brief Resize column data | ||
| 627 | + * | ||
| 628 | + * @param[in] index Start index. | ||
| 629 | + * @param[in] number Number of elements to add/remove. | ||
| 630 | + * | ||
| 631 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 632 | + * @p number is a positive number, removing if @p number is negative. | ||
| 633 | + * Note that the method does not change the validity of the arguments. | ||
| 634 | + * This needs to be done by the client. | ||
| 635 | + ***************************************************************************/ | ||
| 636 | +void GFitsTableLongLongCol::resize_data(const int& index, const int& number) | ||
| 637 | +{ | ||
| 638 | + // Continue only if number of elements is not zero | ||
| 639 | + if (number != 0) { | ||
| 640 | + | ||
| 641 | + // If data are not available then load them now | ||
| 642 | + if (m_data == NULL) fetch_data(); | ||
| 643 | + | ||
| 644 | + // If elements should be removed then do not allocate new memory | ||
| 645 | + // but just move elements forward and change the logical size of | ||
| 646 | + // memory. Only if all elements should be removed the memory is | ||
| 647 | + // released. | ||
| 648 | + if (number < 0) { | ||
| 649 | + int left = index - number; | ||
| 650 | + long long* dst = m_data + index; | ||
| 651 | + long long* src = m_data + left; | ||
| 652 | + int num = m_size - left; | ||
| 653 | + for (int i = 0; i < num; ++i) { | ||
| 654 | + *dst++ = *src++; | ||
| 655 | + } | ||
| 656 | + m_size += number; | ||
| 657 | + if (m_size < 1) { | ||
| 658 | + release_data(); | ||
| 659 | + } | ||
| 660 | + } | ||
| 661 | + | ||
| 662 | + // If elements should be added then allocate new memory, copy over | ||
| 663 | + // the old data and initialise the new elements | ||
| 664 | + else { | ||
| 665 | + int left = m_size - index; | ||
| 666 | + m_size += number; | ||
| 667 | + long long* new_data = new long long[m_size]; | ||
| 668 | + long long* dst = new_data; | ||
| 669 | + long long* src = m_data; | ||
| 670 | + for (int i = 0; i < index; ++i) { | ||
| 671 | + *dst++ = *src++; | ||
| 672 | + } | ||
| 673 | + for (int i = 0; i < number; ++i) { | ||
| 674 | + *dst++ = 0; | ||
| 675 | + } | ||
| 676 | + for (int i = 0; i < left; ++i) { | ||
| 677 | + *dst++ = *src++; | ||
| 678 | + } | ||
| 679 | + if (m_data != NULL) delete [] m_data; | ||
| 680 | + m_data = new_data; | ||
| 681 | + } | ||
| 682 | + | ||
| 683 | + } // endif: number was non-zero | ||
| 684 | + | ||
| 685 | + // Return | ||
| 686 | + return; | ||
| 687 | +} | ||
| 688 | + | ||
| 689 | + | ||
| 690 | +/***********************************************************************//** | ||
| 626 | * @brief Release column data | 691 | * @brief Release column data |
| 627 | ***************************************************************************/ | 692 | ***************************************************************************/ |
| 628 | void GFitsTableLongLongCol::release_data(void) | 693 | void GFitsTableLongLongCol::release_data(void) |
src/fits/GFitsTableStringCol.cpp
| @@ -539,7 +539,8 @@ void GFitsTableStringCol::copy_members(const GFitsTableStringCol& column) | @@ -539,7 +539,8 @@ void GFitsTableStringCol::copy_members(const GFitsTableStringCol& column) | ||
| 539 | 539 | ||
| 540 | // Copy column data | 540 | // Copy column data |
| 541 | if (column.m_data != NULL && m_size > 0) { | 541 | if (column.m_data != NULL && m_size > 0) { |
| 542 | - alloc_data(); | 542 | + if (m_data != NULL) delete [] m_data; |
| 543 | + m_data = new std::string[m_size]; | ||
| 543 | for (int i = 0; i < m_size; ++i) { | 544 | for (int i = 0; i < m_size; ++i) { |
| 544 | m_data[i] = column.m_data[i]; | 545 | m_data[i] = column.m_data[i]; |
| 545 | } | 546 | } |
| @@ -662,6 +663,10 @@ void GFitsTableStringCol::alloc_data(void) | @@ -662,6 +663,10 @@ void GFitsTableStringCol::alloc_data(void) | ||
| 662 | m_data = new std::string[m_size]; | 663 | m_data = new std::string[m_size]; |
| 663 | } | 664 | } |
| 664 | 665 | ||
| 666 | + // Allocate also buffer | ||
| 667 | + free_buffer(); | ||
| 668 | + alloc_buffer(); | ||
| 669 | + | ||
| 665 | // Return | 670 | // Return |
| 666 | return; | 671 | return; |
| 667 | } | 672 | } |
| @@ -679,13 +684,13 @@ void GFitsTableStringCol::alloc_data(void) | @@ -679,13 +684,13 @@ void GFitsTableStringCol::alloc_data(void) | ||
| 679 | void GFitsTableStringCol::fetch_data(void) const | 684 | void GFitsTableStringCol::fetch_data(void) const |
| 680 | { | 685 | { |
| 681 | // Calculate size of memory | 686 | // Calculate size of memory |
| 682 | - m_size = m_number * m_length; | 687 | + //m_size = m_number * m_length; |
| 683 | 688 | ||
| 684 | // Free old buffer memory | 689 | // Free old buffer memory |
| 685 | - free_buffer(); | 690 | + //free_buffer(); |
| 686 | 691 | ||
| 687 | // Allocate buffer memory | 692 | // Allocate buffer memory |
| 688 | - alloc_buffer(); | 693 | + //alloc_buffer(); |
| 689 | 694 | ||
| 690 | // Load column | 695 | // Load column |
| 691 | const_cast<GFitsTableStringCol*>(this)->load_column(); | 696 | const_cast<GFitsTableStringCol*>(this)->load_column(); |
| @@ -706,6 +711,71 @@ void GFitsTableStringCol::fetch_data(void) const | @@ -706,6 +711,71 @@ void GFitsTableStringCol::fetch_data(void) const | ||
| 706 | 711 | ||
| 707 | 712 | ||
| 708 | /***********************************************************************//** | 713 | /***********************************************************************//** |
| 714 | + * @brief Resize column data | ||
| 715 | + * | ||
| 716 | + * @param[in] index Start index. | ||
| 717 | + * @param[in] number Number of elements to add/remove. | ||
| 718 | + * | ||
| 719 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 720 | + * @p number is a positive number, removing if @p number is negative. | ||
| 721 | + * Note that the method does not change the validity of the arguments. | ||
| 722 | + * This needs to be done by the client. | ||
| 723 | + ***************************************************************************/ | ||
| 724 | +void GFitsTableStringCol::resize_data(const int& index, const int& number) | ||
| 725 | +{ | ||
| 726 | + // Continue only if number of elements is not zero | ||
| 727 | + if (number != 0) { | ||
| 728 | + | ||
| 729 | + // If data are not available then load them now | ||
| 730 | + if (m_data == NULL) fetch_data(); | ||
| 731 | + | ||
| 732 | + // If elements should be removed then do not allocate new memory | ||
| 733 | + // but just move elements forward and change the logical size of | ||
| 734 | + // memory. Only if all elements should be removed the memory is | ||
| 735 | + // released. | ||
| 736 | + if (number < 0) { | ||
| 737 | + int left = index - number; | ||
| 738 | + std::string* dst = m_data + index; | ||
| 739 | + std::string* src = m_data + left; | ||
| 740 | + int num = m_size - left; | ||
| 741 | + for (int i = 0; i < num; ++i) { | ||
| 742 | + *dst++ = *src++; | ||
| 743 | + } | ||
| 744 | + m_size += number; | ||
| 745 | + if (m_size < 1) { | ||
| 746 | + release_data(); | ||
| 747 | + } | ||
| 748 | + } | ||
| 749 | + | ||
| 750 | + // If elements should be added then allocate new memory, copy over | ||
| 751 | + // the old data and initialise the new elements | ||
| 752 | + else { | ||
| 753 | + int left = m_size - index; | ||
| 754 | + m_size += number; | ||
| 755 | + std::string* new_data = new std::string[m_size]; | ||
| 756 | + std::string* dst = new_data; | ||
| 757 | + std::string* src = m_data; | ||
| 758 | + for (int i = 0; i < index; ++i) { | ||
| 759 | + *dst++ = *src++; | ||
| 760 | + } | ||
| 761 | + for (int i = 0; i < number; ++i) { | ||
| 762 | + *dst++ = ""; | ||
| 763 | + } | ||
| 764 | + for (int i = 0; i < left; ++i) { | ||
| 765 | + *dst++ = *src++; | ||
| 766 | + } | ||
| 767 | + if (m_data != NULL) delete [] m_data; | ||
| 768 | + m_data = new_data; | ||
| 769 | + } | ||
| 770 | + | ||
| 771 | + } // endif: number was non-zero | ||
| 772 | + | ||
| 773 | + // Return | ||
| 774 | + return; | ||
| 775 | +} | ||
| 776 | + | ||
| 777 | + | ||
| 778 | +/***********************************************************************//** | ||
| 709 | * @brief Release column data | 779 | * @brief Release column data |
| 710 | ***************************************************************************/ | 780 | ***************************************************************************/ |
| 711 | void GFitsTableStringCol::release_data(void) | 781 | void GFitsTableStringCol::release_data(void) |
src/fits/GFitsTableULongCol.cpp
| @@ -619,6 +619,71 @@ void GFitsTableULongCol::fetch_data(void) const | @@ -619,6 +619,71 @@ void GFitsTableULongCol::fetch_data(void) const | ||
| 619 | 619 | ||
| 620 | 620 | ||
| 621 | /***********************************************************************//** | 621 | /***********************************************************************//** |
| 622 | + * @brief Resize column data | ||
| 623 | + * | ||
| 624 | + * @param[in] index Start index. | ||
| 625 | + * @param[in] number Number of elements to add/remove. | ||
| 626 | + * | ||
| 627 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 628 | + * @p number is a positive number, removing if @p number is negative. | ||
| 629 | + * Note that the method does not change the validity of the arguments. | ||
| 630 | + * This needs to be done by the client. | ||
| 631 | + ***************************************************************************/ | ||
| 632 | +void GFitsTableULongCol::resize_data(const int& index, const int& number) | ||
| 633 | +{ | ||
| 634 | + // Continue only if number of elements is not zero | ||
| 635 | + if (number != 0) { | ||
| 636 | + | ||
| 637 | + // If data are not available then load them now | ||
| 638 | + if (m_data == NULL) fetch_data(); | ||
| 639 | + | ||
| 640 | + // If elements should be removed then do not allocate new memory | ||
| 641 | + // but just move elements forward and change the logical size of | ||
| 642 | + // memory. Only if all elements should be removed the memory is | ||
| 643 | + // released. | ||
| 644 | + if (number < 0) { | ||
| 645 | + int left = index - number; | ||
| 646 | + unsigned long* dst = m_data + index; | ||
| 647 | + unsigned long* src = m_data + left; | ||
| 648 | + int num = m_size - left; | ||
| 649 | + for (int i = 0; i < num; ++i) { | ||
| 650 | + *dst++ = *src++; | ||
| 651 | + } | ||
| 652 | + m_size += number; | ||
| 653 | + if (m_size < 1) { | ||
| 654 | + release_data(); | ||
| 655 | + } | ||
| 656 | + } | ||
| 657 | + | ||
| 658 | + // If elements should be added then allocate new memory, copy over | ||
| 659 | + // the old data and initialise the new elements | ||
| 660 | + else { | ||
| 661 | + int left = m_size - index; | ||
| 662 | + m_size += number; | ||
| 663 | + unsigned long* new_data = new unsigned long[m_size]; | ||
| 664 | + unsigned long* dst = new_data; | ||
| 665 | + unsigned long* src = m_data; | ||
| 666 | + for (int i = 0; i < index; ++i) { | ||
| 667 | + *dst++ = *src++; | ||
| 668 | + } | ||
| 669 | + for (int i = 0; i < number; ++i) { | ||
| 670 | + *dst++ = 0; | ||
| 671 | + } | ||
| 672 | + for (int i = 0; i < left; ++i) { | ||
| 673 | + *dst++ = *src++; | ||
| 674 | + } | ||
| 675 | + if (m_data != NULL) delete [] m_data; | ||
| 676 | + m_data = new_data; | ||
| 677 | + } | ||
| 678 | + | ||
| 679 | + } // endif: number was non-zero | ||
| 680 | + | ||
| 681 | + // Return | ||
| 682 | + return; | ||
| 683 | +} | ||
| 684 | + | ||
| 685 | + | ||
| 686 | +/***********************************************************************//** | ||
| 622 | * @brief Release column data | 687 | * @brief Release column data |
| 623 | ***************************************************************************/ | 688 | ***************************************************************************/ |
| 624 | void GFitsTableULongCol::release_data(void) | 689 | void GFitsTableULongCol::release_data(void) |
src/fits/GFitsTableUShortCol.cpp
| @@ -619,6 +619,71 @@ void GFitsTableUShortCol::fetch_data(void) const | @@ -619,6 +619,71 @@ void GFitsTableUShortCol::fetch_data(void) const | ||
| 619 | 619 | ||
| 620 | 620 | ||
| 621 | /***********************************************************************//** | 621 | /***********************************************************************//** |
| 622 | + * @brief Resize column data | ||
| 623 | + * | ||
| 624 | + * @param[in] index Start index. | ||
| 625 | + * @param[in] number Number of elements to add/remove. | ||
| 626 | + * | ||
| 627 | + * Adds or removes elements from specified index on. Adding is done if | ||
| 628 | + * @p number is a positive number, removing if @p number is negative. | ||
| 629 | + * Note that the method does not change the validity of the arguments. | ||
| 630 | + * This needs to be done by the client. | ||
| 631 | + ***************************************************************************/ | ||
| 632 | +void GFitsTableUShortCol::resize_data(const int& index, const int& number) | ||
| 633 | +{ | ||
| 634 | + // Continue only if number of elements is not zero | ||
| 635 | + if (number != 0) { | ||
| 636 | + | ||
| 637 | + // If data are not available then load them now | ||
| 638 | + if (m_data == NULL) fetch_data(); | ||
| 639 | + | ||
| 640 | + // If elements should be removed then do not allocate new memory | ||
| 641 | + // but just move elements forward and change the logical size of | ||
| 642 | + // memory. Only if all elements should be removed the memory is | ||
| 643 | + // released. | ||
| 644 | + if (number < 0) { | ||
| 645 | + int left = index - number; | ||
| 646 | + unsigned short* dst = m_data + index; | ||
| 647 | + unsigned short* src = m_data + left; | ||
| 648 | + int num = m_size - left; | ||
| 649 | + for (int i = 0; i < num; ++i) { | ||
| 650 | + *dst++ = *src++; | ||
| 651 | + } | ||
| 652 | + m_size += number; | ||
| 653 | + if (m_size < 1) { | ||
| 654 | + release_data(); | ||
| 655 | + } | ||
| 656 | + } | ||
| 657 | + | ||
| 658 | + // If elements should be added then allocate new memory, copy over | ||
| 659 | + // the old data and initialise the new elements | ||
| 660 | + else { | ||
| 661 | + int left = m_size - index; | ||
| 662 | + m_size += number; | ||
| 663 | + unsigned short* new_data = new unsigned short[m_size]; | ||
| 664 | + unsigned short* dst = new_data; | ||
| 665 | + unsigned short* src = m_data; | ||
| 666 | + for (int i = 0; i < index; ++i) { | ||
| 667 | + *dst++ = *src++; | ||
| 668 | + } | ||
| 669 | + for (int i = 0; i < number; ++i) { | ||
| 670 | + *dst++ = 0; | ||
| 671 | + } | ||
| 672 | + for (int i = 0; i < left; ++i) { | ||
| 673 | + *dst++ = *src++; | ||
| 674 | + } | ||
| 675 | + if (m_data != NULL) delete [] m_data; | ||
| 676 | + m_data = new_data; | ||
| 677 | + } | ||
| 678 | + | ||
| 679 | + } // endif: number was non-zero | ||
| 680 | + | ||
| 681 | + // Return | ||
| 682 | + return; | ||
| 683 | +} | ||
| 684 | + | ||
| 685 | + | ||
| 686 | +/***********************************************************************//** | ||
| 622 | * @brief Release column data | 687 | * @brief Release column data |
| 623 | ***************************************************************************/ | 688 | ***************************************************************************/ |
| 624 | void GFitsTableUShortCol::release_data(void) | 689 | void GFitsTableUShortCol::release_data(void) |
test/test_GFits.cpp
| @@ -208,6 +208,71 @@ | @@ -208,6 +208,71 @@ | ||
| 208 | col2.string(i,j)+" is not "+gammalib::str(val)); \ | 208 | col2.string(i,j)+" is not "+gammalib::str(val)); \ |
| 209 | } \ | 209 | } \ |
| 210 | } | 210 | } |
| 211 | +#define TEST_TABLE2_BOOL \ | ||
| 212 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 213 | + for (int j = 0; j < nvec; ++j) { \ | ||
| 214 | + col2(i,j) = (i % 2) * (j % 2); \ | ||
| 215 | + } \ | ||
| 216 | + } \ | ||
| 217 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 218 | + for (int j = 0; j < nvec; ++j) { \ | ||
| 219 | + int ival = ((i % 2) * (j % 2)); \ | ||
| 220 | + std::string sval = ((i % 2) * (j % 2)) ? "T" : "F"; \ | ||
| 221 | + test_assert((col2(i,j) == ival), \ | ||
| 222 | + "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 223 | + gammalib::str(col2(i,j))+" is not "+gammalib::str(ival)); \ | ||
| 224 | + test_assert((col2.real(i,j) == double(ival)), \ | ||
| 225 | + "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 226 | + gammalib::str(col2.real(i,j))+" is not "+gammalib::str(double(ival))); \ | ||
| 227 | + test_assert((col2.integer(i,j) == int(ival)), \ | ||
| 228 | + "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 229 | + gammalib::str(col2.integer(i,j))+" is not "+gammalib::str(int(ival))); \ | ||
| 230 | + test_assert((col2.string(i,j) == gammalib::str(ival) || col2.string(i,j) == sval), \ | ||
| 231 | + "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 232 | + col2.string(i,j)+" is not "+gammalib::str(ival)+" or "+sval); \ | ||
| 233 | + } \ | ||
| 234 | + } | ||
| 235 | +#define TEST_TABLE2_STRING \ | ||
| 236 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 237 | + for (int j = 0; j < nvec; ++j) { \ | ||
| 238 | + col2(i,j) = gammalib::str(double(i)*2.3 + double(j)*11.7 + 0.95); \ | ||
| 239 | + } \ | ||
| 240 | + } \ | ||
| 241 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 242 | + for (int j = 0; j < nvec; ++j) { \ | ||
| 243 | + double val = double(i)*2.3 + double(j)*11.7 + 0.95; \ | ||
| 244 | + test_value(gammalib::todouble(col2(i,j)), val, 1e-6, \ | ||
| 245 | + "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 246 | + test_value(col2.real(i,j), val, 1e-6, \ | ||
| 247 | + "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 248 | + test_value(col2.integer(i,j), int(val), 1e-6, \ | ||
| 249 | + "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 250 | + test_assert((col2.string(i,j) == gammalib::str(val)), \ | ||
| 251 | + "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 252 | + col2.string(i,j)+" is not "+gammalib::str(val)); \ | ||
| 253 | + } \ | ||
| 254 | + } | ||
| 255 | +#define TEST_VARTABLE \ | ||
| 256 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 257 | + col3.elements(i,i+1); \ | ||
| 258 | + for (int j = 0; j < i+1; ++j) { \ | ||
| 259 | + col3(i,j) = double(i)*2.3 + double(j)*11.7 + 0.95; \ | ||
| 260 | + } \ | ||
| 261 | + } \ | ||
| 262 | + for (int i = 0; i < nrows; ++i) { \ | ||
| 263 | + for (int j = 0; j < i+1; ++j) { \ | ||
| 264 | + double val = double(i)*2.3 + double(j)*11.7 + 0.95; \ | ||
| 265 | + test_value(col3(i,j), val, 1e-6, \ | ||
| 266 | + "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 267 | + test_value(col3.real(i,j), val, 1e-6, \ | ||
| 268 | + "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 269 | + test_value(col3.integer(i,j), int(val), 1e-6, \ | ||
| 270 | + "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | ||
| 271 | + test_assert((col3.string(i,j) == gammalib::str(val)), \ | ||
| 272 | + "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | ||
| 273 | + col3.string(i,j)+" is not "+gammalib::str(val)); \ | ||
| 274 | + } \ | ||
| 275 | + } | ||
| 211 | #define TEST_VARTABLE_INT \ | 276 | #define TEST_VARTABLE_INT \ |
| 212 | for (int i = 0; i < nrows; ++i) { \ | 277 | for (int i = 0; i < nrows; ++i) { \ |
| 213 | col3.elements(i,i+1); \ | 278 | col3.elements(i,i+1); \ |
| @@ -232,48 +297,50 @@ | @@ -232,48 +297,50 @@ | ||
| 232 | col3.string(i,j)+" is not "+gammalib::str(val)); \ | 297 | col3.string(i,j)+" is not "+gammalib::str(val)); \ |
| 233 | } \ | 298 | } \ |
| 234 | } | 299 | } |
| 235 | -#define TEST_TABLE2_BOOL \ | 300 | +#define TEST_VARTABLE_BOOL \ |
| 236 | for (int i = 0; i < nrows; ++i) { \ | 301 | for (int i = 0; i < nrows; ++i) { \ |
| 237 | - for (int j = 0; j < nvec; ++j) { \ | ||
| 238 | - col2(i,j) = (i % 2) * (j % 2); \ | 302 | + col3.elements(i,i+1); \ |
| 303 | + for (int j = 0; j < i+1; ++j) { \ | ||
| 304 | + col3(i,j) = (i % 2) * (j % 2); \ | ||
| 239 | } \ | 305 | } \ |
| 240 | } \ | 306 | } \ |
| 241 | for (int i = 0; i < nrows; ++i) { \ | 307 | for (int i = 0; i < nrows; ++i) { \ |
| 242 | - for (int j = 0; j < nvec; ++j) { \ | 308 | + for (int j = 0; j < i+1; ++j) { \ |
| 243 | int ival = ((i % 2) * (j % 2)); \ | 309 | int ival = ((i % 2) * (j % 2)); \ |
| 244 | std::string sval = ((i % 2) * (j % 2)) ? "T" : "F"; \ | 310 | std::string sval = ((i % 2) * (j % 2)) ? "T" : "F"; \ |
| 245 | - test_assert((col2(i,j) == ival), \ | 311 | + test_assert((col3(i,j) == ival), \ |
| 246 | "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | 312 | "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j), \ |
| 247 | - gammalib::str(col2(i,j))+" is not "+gammalib::str(ival)); \ | ||
| 248 | - test_assert((col2.real(i,j) == double(ival)), \ | 313 | + gammalib::str(col3(i,j))+" is not "+gammalib::str(ival)); \ |
| 314 | + test_assert((col3.real(i,j) == double(ival)), \ | ||
| 249 | "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | 315 | "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ |
| 250 | - gammalib::str(col2.real(i,j))+" is not "+gammalib::str(double(ival))); \ | ||
| 251 | - test_assert((col2.integer(i,j) == int(ival)), \ | 316 | + gammalib::str(col3.real(i,j))+" is not "+gammalib::str(double(ival))); \ |
| 317 | + test_assert((col3.integer(i,j) == int(ival)), \ | ||
| 252 | "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | 318 | "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ |
| 253 | - gammalib::str(col2.integer(i,j))+" is not "+gammalib::str(int(ival))); \ | ||
| 254 | - test_assert((col2.string(i,j) == gammalib::str(ival) || col2.string(i,j) == sval), \ | 319 | + gammalib::str(col3.integer(i,j))+" is not "+gammalib::str(int(ival))); \ |
| 320 | + test_assert((col3.string(i,j) == gammalib::str(ival) || col3.string(i,j) == sval), \ | ||
| 255 | "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | 321 | "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ |
| 256 | - col2.string(i,j)+" is not "+gammalib::str(ival)+" or "+sval); \ | 322 | + col3.string(i,j)+" is not "+gammalib::str(ival)+" or "+sval); \ |
| 257 | } \ | 323 | } \ |
| 258 | } | 324 | } |
| 259 | -#define TEST_TABLE2_STRING \ | 325 | +#define TEST_VARTABLE_STRING \ |
| 260 | for (int i = 0; i < nrows; ++i) { \ | 326 | for (int i = 0; i < nrows; ++i) { \ |
| 261 | - for (int j = 0; j < nvec; ++j) { \ | ||
| 262 | - col2(i,j) = gammalib::str(double(i)*2.3 + double(j)*11.7 + 0.95); \ | 327 | + col3.elements(i,i+1); \ |
| 328 | + for (int j = 0; j < i+1; ++j) { \ | ||
| 329 | + col3(i,j) = gammalib::str(double(i)*2.3 + double(j)*11.7 + 0.95); \ | ||
| 263 | } \ | 330 | } \ |
| 264 | } \ | 331 | } \ |
| 265 | for (int i = 0; i < nrows; ++i) { \ | 332 | for (int i = 0; i < nrows; ++i) { \ |
| 266 | - for (int j = 0; j < nvec; ++j) { \ | 333 | + for (int j = 0; j < i+1; ++j) { \ |
| 267 | double val = double(i)*2.3 + double(j)*11.7 + 0.95; \ | 334 | double val = double(i)*2.3 + double(j)*11.7 + 0.95; \ |
| 268 | - test_value(gammalib::todouble(col2(i,j)), val, 1e-6, \ | 335 | + test_value(gammalib::todouble(col3(i,j)), val, 1e-6, \ |
| 269 | "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | 336 | "Test access operator row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ |
| 270 | - test_value(col2.real(i,j), val, 1e-6, \ | 337 | + test_value(col3.real(i,j), val, 1e-6, \ |
| 271 | "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | 338 | "Test real() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ |
| 272 | - test_value(col2.integer(i,j), int(val), 1e-6, \ | 339 | + test_value(col3.integer(i,j), int(val), 1e-6, \ |
| 273 | "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ | 340 | "Test integer() method for row "+gammalib::str(i)+" and element "+gammalib::str(j)); \ |
| 274 | - test_assert((col2.string(i,j) == gammalib::str(val)), \ | 341 | + test_assert((col3.string(i,j) == gammalib::str(val)), \ |
| 275 | "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ | 342 | "Test string() method for row "+gammalib::str(i)+" and element "+gammalib::str(j), \ |
| 276 | - col2.string(i,j)+" is not "+gammalib::str(val)); \ | 343 | + col3.string(i,j)+" is not "+gammalib::str(val)); \ |
| 277 | } \ | 344 | } \ |
| 278 | } | 345 | } |
| 279 | #define TEST_WRITE_TABLES \ | 346 | #define TEST_WRITE_TABLES \ |
| @@ -284,6 +351,7 @@ | @@ -284,6 +351,7 @@ | ||
| 284 | GFitsBinTable table = GFitsBinTable(nrows); \ | 351 | GFitsBinTable table = GFitsBinTable(nrows); \ |
| 285 | table.append_column(col1); \ | 352 | table.append_column(col1); \ |
| 286 | table.insert_column(1, col2); \ | 353 | table.insert_column(1, col2); \ |
| 354 | + table.append_column(col3); \ | ||
| 287 | fits.append(table); \ | 355 | fits.append(table); \ |
| 288 | fits.save(); \ | 356 | fits.save(); \ |
| 289 | fits.close(); \ | 357 | fits.close(); \ |
| @@ -945,6 +1013,10 @@ void TestGFits::test_bintable_double(void) | @@ -945,6 +1013,10 @@ void TestGFits::test_bintable_double(void) | ||
| 945 | GFitsTableDoubleCol col2("DOUBLE10", nrows, nvec); | 1013 | GFitsTableDoubleCol col2("DOUBLE10", nrows, nvec); |
| 946 | TEST_TABLE2; | 1014 | TEST_TABLE2; |
| 947 | 1015 | ||
| 1016 | + // Test variable-length column table | ||
| 1017 | + GFitsTableDoubleCol col3("DOUBLEVAR", nrows, -1); | ||
| 1018 | + TEST_VARTABLE; | ||
| 1019 | + | ||
| 948 | // Write tables | 1020 | // Write tables |
| 949 | TEST_WRITE_TABLES; | 1021 | TEST_WRITE_TABLES; |
| 950 | 1022 | ||
| @@ -995,6 +1067,10 @@ void TestGFits::test_bintable_float(void) | @@ -995,6 +1067,10 @@ void TestGFits::test_bintable_float(void) | ||
| 995 | GFitsTableFloatCol col2("FLOAT10", nrows, nvec); | 1067 | GFitsTableFloatCol col2("FLOAT10", nrows, nvec); |
| 996 | TEST_TABLE2; | 1068 | TEST_TABLE2; |
| 997 | 1069 | ||
| 1070 | + // Test variable-length column table | ||
| 1071 | + GFitsTableFloatCol col3("FLOATVAR", nrows, -1); | ||
| 1072 | + TEST_VARTABLE; | ||
| 1073 | + | ||
| 998 | // Write tables | 1074 | // Write tables |
| 999 | TEST_WRITE_TABLES; | 1075 | TEST_WRITE_TABLES; |
| 1000 | 1076 | ||
| @@ -1101,6 +1177,10 @@ void TestGFits::test_bintable_short(void) | @@ -1101,6 +1177,10 @@ void TestGFits::test_bintable_short(void) | ||
| 1101 | GFitsTableUShortCol col2("USHORT10", nrows, nvec); | 1177 | GFitsTableUShortCol col2("USHORT10", nrows, nvec); |
| 1102 | TEST_TABLE2_INT; | 1178 | TEST_TABLE2_INT; |
| 1103 | 1179 | ||
| 1180 | + // Test variable-length column table | ||
| 1181 | + GFitsTableUShortCol col3("USHORTVAR", nrows, -1); | ||
| 1182 | + TEST_VARTABLE_INT; | ||
| 1183 | + | ||
| 1104 | // Write tables | 1184 | // Write tables |
| 1105 | TEST_WRITE_TABLES; | 1185 | TEST_WRITE_TABLES; |
| 1106 | 1186 | ||
| @@ -1152,6 +1232,10 @@ void TestGFits::test_bintable_long(void) | @@ -1152,6 +1232,10 @@ void TestGFits::test_bintable_long(void) | ||
| 1152 | GFitsTableLongCol col2("LONG10", nrows, nvec); | 1232 | GFitsTableLongCol col2("LONG10", nrows, nvec); |
| 1153 | TEST_TABLE2_INT; | 1233 | TEST_TABLE2_INT; |
| 1154 | 1234 | ||
| 1235 | + // Test variable-length column table | ||
| 1236 | + GFitsTableLongCol col3("LONGVAR", nrows, -1); | ||
| 1237 | + TEST_VARTABLE_INT; | ||
| 1238 | + | ||
| 1155 | // Write tables | 1239 | // Write tables |
| 1156 | TEST_WRITE_TABLES; | 1240 | TEST_WRITE_TABLES; |
| 1157 | 1241 | ||
| @@ -1203,6 +1287,10 @@ void TestGFits::test_bintable_longlong(void) | @@ -1203,6 +1287,10 @@ void TestGFits::test_bintable_longlong(void) | ||
| 1203 | GFitsTableLongLongCol col2("LONGLONG10", nrows, nvec); | 1287 | GFitsTableLongLongCol col2("LONGLONG10", nrows, nvec); |
| 1204 | TEST_TABLE2_INT; | 1288 | TEST_TABLE2_INT; |
| 1205 | 1289 | ||
| 1290 | + // Test variable-length column table | ||
| 1291 | + GFitsTableLongLongCol col3("LONGLONGVAR", nrows, -1); | ||
| 1292 | + TEST_VARTABLE_INT; | ||
| 1293 | + | ||
| 1206 | // Write tables | 1294 | // Write tables |
| 1207 | TEST_WRITE_TABLES; | 1295 | TEST_WRITE_TABLES; |
| 1208 | 1296 | ||
| @@ -1254,6 +1342,10 @@ void TestGFits::test_bintable_ulong(void) | @@ -1254,6 +1342,10 @@ void TestGFits::test_bintable_ulong(void) | ||
| 1254 | GFitsTableULongCol col2("ULONG10", nrows, nvec); | 1342 | GFitsTableULongCol col2("ULONG10", nrows, nvec); |
| 1255 | TEST_TABLE2_INT; | 1343 | TEST_TABLE2_INT; |
| 1256 | 1344 | ||
| 1345 | + // Test variable-length column table | ||
| 1346 | + GFitsTableULongCol col3("ULONGVAR", nrows, -1); | ||
| 1347 | + TEST_VARTABLE_INT; | ||
| 1348 | + | ||
| 1257 | // Write tables | 1349 | // Write tables |
| 1258 | TEST_WRITE_TABLES; | 1350 | TEST_WRITE_TABLES; |
| 1259 | 1351 | ||
| @@ -1305,6 +1397,11 @@ void TestGFits::test_bintable_string(void) | @@ -1305,6 +1397,11 @@ void TestGFits::test_bintable_string(void) | ||
| 1305 | GFitsTableStringCol col2("STRING10", nrows, 20, nvec); | 1397 | GFitsTableStringCol col2("STRING10", nrows, 20, nvec); |
| 1306 | TEST_TABLE2_STRING; | 1398 | TEST_TABLE2_STRING; |
| 1307 | 1399 | ||
| 1400 | + // Test variable-length column table | ||
| 1401 | + GFitsTableStringCol col3("STRINGVAR", nrows, 1); | ||
| 1402 | + //GFitsTableStringCol col3("STRINGVAR", nrows, -1); | ||
| 1403 | + //TEST_VARTABLE_STRING; | ||
| 1404 | + | ||
| 1308 | // Write tables | 1405 | // Write tables |
| 1309 | TEST_WRITE_TABLES; | 1406 | TEST_WRITE_TABLES; |
| 1310 | 1407 | ||
| @@ -1356,6 +1453,10 @@ void TestGFits::test_bintable_logical(void) | @@ -1356,6 +1453,10 @@ void TestGFits::test_bintable_logical(void) | ||
| 1356 | GFitsTableBoolCol col2("LOGICAL10", nrows, nvec); | 1453 | GFitsTableBoolCol col2("LOGICAL10", nrows, nvec); |
| 1357 | TEST_TABLE2_BOOL; | 1454 | TEST_TABLE2_BOOL; |
| 1358 | 1455 | ||
| 1456 | + // Test variable-length column table | ||
| 1457 | + GFitsTableBoolCol col3("LOGICALVAR", nrows, -1); | ||
| 1458 | + TEST_VARTABLE_BOOL; | ||
| 1459 | + | ||
| 1359 | // Write tables | 1460 | // Write tables |
| 1360 | TEST_WRITE_TABLES; | 1461 | TEST_WRITE_TABLES; |
| 1361 | 1462 | ||
| @@ -1407,6 +1508,10 @@ void TestGFits::test_bintable_bit(void) | @@ -1407,6 +1508,10 @@ void TestGFits::test_bintable_bit(void) | ||
| 1407 | GFitsTableBitCol col2("BIT10", nrows, nvec); | 1508 | GFitsTableBitCol col2("BIT10", nrows, nvec); |
| 1408 | TEST_TABLE2_BOOL; | 1509 | TEST_TABLE2_BOOL; |
| 1409 | 1510 | ||
| 1511 | + // Test variable-length column table | ||
| 1512 | + GFitsTableBitCol col3("BITVAR", nrows, -1); | ||
| 1513 | + //TEST_VARTABLE_BOOL; | ||
| 1514 | + | ||
| 1410 | // Write tables | 1515 | // Write tables |
| 1411 | TEST_WRITE_TABLES; | 1516 | TEST_WRITE_TABLES; |
| 1412 | 1517 |