// Copyright (C) 2018-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
// any later version.

// This library 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 library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

// rope (SGI extension)

// { dg-do run }

#include <ext/rope>
#include <testsuite_hooks.h>

void
test01()
{
  using __gnu_cxx::crope;

  char str_a[] =
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  char str_b[] =
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";

  // Create ropes with leaf nodes longer than __lazy_threshold = 128
  // so substring nodes will be created by the next step
  crope leaf_rope_a(str_a);
  crope leaf_rope_b(str_b);

  // Create ropes with substring nodes referencing the leaf nodes
  // of the prior ropes
  crope substring_rope_a(leaf_rope_a.begin() + 1,
                         leaf_rope_a.begin() + 199);
  crope substring_rope_b(leaf_rope_b.begin() + 1,
                         leaf_rope_b.begin() + 199);

  // Create iterators to substring_rope_a
  crope::const_iterator cit_orig = substring_rope_a.begin();
  crope::iterator mit_orig = substring_rope_a.mutable_begin();

  // Dereference the iterators so they cache a portion of the substring
  // node in their internal buffers
  *cit_orig;
  *mit_orig;

  // Copy the original iterators, via both copy constructors and
  // assignment operators.  Prior to the bug fix, these iterators
  // retained pointers to the internal buffers of the original
  // iterators.
  crope::const_iterator cit_copy(cit_orig);
  crope::iterator mit_copy(mit_orig);
  crope::const_iterator cit_assign; cit_assign = cit_orig;
  crope::iterator mit_assign; mit_assign = mit_orig;

  // Modify the original iterators to refer to substring_rope_b
  cit_orig = substring_rope_b.begin();
  mit_orig = substring_rope_b.mutable_begin();

  // Dereference the original iterators so they fill their internal
  // buffers with part of substring_rope_b
  *cit_orig;
  *mit_orig;

  // Verify that the copied iterators return data from
  // substring_rope_a, not substring_rope_b
  VERIFY(*cit_copy == 'a');
  VERIFY(*mit_copy == 'a');
  VERIFY(*cit_assign == 'a');
  VERIFY(*mit_assign == 'a');
}

int
main()
{
  test01();
  return 0;
}
