Coverage Report

Created: 2025-06-13 06:26

/src/boost/boost/json/string.hpp
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3
// Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)
4
//
5
// Distributed under the Boost Software License, Version 1.0. (See accompanying
6
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
//
8
// Official repository: https://github.com/boostorg/json
9
//
10
11
#ifndef BOOST_JSON_STRING_HPP
12
#define BOOST_JSON_STRING_HPP
13
14
#include <boost/json/detail/config.hpp>
15
#include <boost/json/pilfer.hpp>
16
#include <boost/json/storage_ptr.hpp>
17
#include <boost/json/string_view.hpp>
18
#include <boost/json/detail/digest.hpp>
19
#include <boost/json/detail/except.hpp>
20
#include <boost/json/detail/string_impl.hpp>
21
#include <boost/json/detail/value.hpp>
22
#include <boost/system/result.hpp>
23
#include <cstring>
24
#include <iosfwd>
25
#include <iterator>
26
#include <new>
27
#include <type_traits>
28
#include <utility>
29
30
namespace boost {
31
namespace json {
32
33
class value;
34
35
/** The native type of string values.
36
37
    Instances of string store and manipulate sequences
38
    of `char` using the UTF-8 encoding. The elements of
39
    a string are stored contiguously. A pointer to any
40
    character in a string may be passed to functions
41
    that expect a pointer to the first element of a
42
    null-terminated `char` array. The type uses small
43
    buffer optimisation to avoid allocations for small
44
    strings.
45
46
    String iterators are regular `char` pointers.
47
48
    @note `string` member functions do not validate
49
    any UTF-8 byte sequences passed to them.
50
51
    @par Thread Safety
52
53
    Non-const member functions may not be called
54
    concurrently with any other member functions.
55
56
    @par Satisfies
57
        <a href="https://en.cppreference.com/w/cpp/named_req/ContiguousContainer"><em>ContiguousContainer</em></a>,
58
        <a href="https://en.cppreference.com/w/cpp/named_req/ReversibleContainer"><em>ReversibleContainer</em></a>, and
59
        <a href="https://en.cppreference.com/w/cpp/named_req/SequenceContainer"><em>SequenceContainer</em></a>.
60
*/
61
class string
62
{
63
    friend class value;
64
#ifndef BOOST_JSON_DOCS
65
    // VFALCO doc toolchain shouldn't show this but does
66
    friend struct detail::access;
67
#endif
68
69
    using string_impl = detail::string_impl;
70
71
    inline
72
    string(
73
        detail::key_t const&,
74
        string_view s,
75
        storage_ptr sp);
76
77
    inline
78
    string(
79
        detail::key_t const&,
80
        string_view s1,
81
        string_view s2,
82
        storage_ptr sp);
83
84
public:
85
    /// Associated [Allocator](https://en.cppreference.com/w/cpp/named_req/Allocator)
86
    using allocator_type = container::pmr::polymorphic_allocator<value>;
87
88
    /// The type of a character
89
    using value_type        = char;
90
91
    /// The type used to represent unsigned integers
92
    using size_type         = std::size_t;
93
94
    /// The type used to represent signed integers
95
    using difference_type   = std::ptrdiff_t;
96
97
    /// A pointer to an element
98
    using pointer           = char*;
99
100
    /// A const pointer to an element
101
    using const_pointer     = char const*;
102
103
    /// A reference to an element
104
    using reference         = char&;
105
106
    /// A const reference to an element
107
    using const_reference   = const char&;
108
109
    /// A random access iterator to an element
110
    using iterator          = char*;
111
112
    /// A random access const iterator to an element
113
    using const_iterator    = char const*;
114
115
    /// A reverse random access iterator to an element
116
    using reverse_iterator =
117
        std::reverse_iterator<iterator>;
118
119
    /// A reverse random access const iterator to an element
120
    using const_reverse_iterator =
121
        std::reverse_iterator<const_iterator>;
122
123
    /// A special index
124
    static constexpr std::size_t npos =
125
        string_view::npos;
126
127
private:
128
    template<class T>
129
    using is_inputit = typename std::enable_if<
130
        std::is_convertible<typename
131
            std::iterator_traits<T>::reference,
132
            char>::value>::type;
133
134
    storage_ptr sp_; // must come first
135
    string_impl impl_;
136
137
public:
138
    /** Destructor.
139
140
        Any dynamically allocated internal storage
141
        is freed.
142
143
        @par Complexity
144
        Constant.
145
146
        @par Exception Safety
147
        No-throw guarantee.
148
    */
149
    ~string() noexcept
150
46.2k
    {
151
46.2k
        impl_.destroy(sp_);
152
46.2k
    }
153
154
    //------------------------------------------------------
155
    //
156
    // Construction
157
    //
158
    //------------------------------------------------------
159
160
    /** Default constructor.
161
162
        The string will have a zero size and a non-zero,
163
        unspecified capacity, using the [default memory resource].
164
165
        @par Complexity
166
167
        Constant.
168
169
        [default memory resource]: json/allocators/storage_ptr.html#json.allocators.storage_ptr.default_memory_resource
170
    */
171
    string() = default;
172
173
    /** Pilfer constructor.
174
175
        The string is constructed by acquiring ownership
176
        of the contents of `other` using pilfer semantics.
177
        This is more efficient than move construction, when
178
        it is known that the moved-from object will be
179
        immediately destroyed afterwards.
180
181
        @par Complexity
182
        Constant.
183
184
        @par Exception Safety
185
        No-throw guarantee.
186
187
        @param other The value to pilfer. After pilfer
188
        construction, `other` is not in a usable state
189
        and may only be destroyed.
190
191
        @see @ref pilfer,
192
            <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">
193
                Valueless Variants Considered Harmful</a>
194
    */
195
    string(pilfered<string> other) noexcept
196
0
        : sp_(std::move(other.get().sp_))
197
0
        , impl_(other.get().impl_)
198
0
    {
199
0
        ::new(&other.get().impl_) string_impl();
200
0
    }
201
202
    /** Constructor.
203
204
        The string will have zero size and a non-zero,
205
        unspecified capacity, obtained from the specified
206
        memory resource.
207
208
        @par Complexity
209
210
        Constant.
211
212
        @param sp A pointer to the `boost::container::pmr::memory_resource` to
213
        use. The container will acquire shared ownership of the memory
214
        resource.
215
    */
216
    explicit
217
    string(storage_ptr sp)
218
17.9k
        : sp_(std::move(sp))
219
17.9k
    {
220
17.9k
    }
221
222
    /** Constructor.
223
224
        Construct the contents with `count` copies of
225
        character `ch`.
226
227
        @par Complexity
228
229
        Linear in `count`.
230
231
        @par Exception Safety
232
233
        Strong guarantee.
234
        Calls to `memory_resource::allocate` may throw.
235
236
        @param count The size of the resulting string.
237
238
        @param ch The value to initialize characters
239
        of the string with.
240
241
        @param sp An optional pointer to the
242
        `boost::container::pmr::memory_resource` to use. The container will
243
        acquire shared ownership of the memory resource. The default argument
244
        for this parameter is `{}`.
245
246
        @throw `boost::system::system_error` `count > max_size()`.
247
    */
248
    BOOST_JSON_DECL
249
    explicit
250
    string(
251
        std::size_t count,
252
        char ch,
253
        storage_ptr sp = {});
254
255
    /** Constructor.
256
257
        Construct the contents with those of the null
258
        terminated string pointed to by `s`. The length
259
        of the string is determined by the first null
260
        character.
261
262
        @par Complexity
263
264
        Linear in `strlen(s)`.
265
266
        @par Exception Safety
267
268
        Strong guarantee.
269
        Calls to `memory_resource::allocate` may throw.
270
271
        @param s A pointer to a character string used to
272
        copy from.
273
274
        @param sp An optional pointer to the
275
        `boost::container::pmr::memory_resource` to use. The container will
276
        acquire shared ownership of the memory resource. The default argument
277
        for this parameter is `{}`.
278
279
        @throw `boost::system::system_error` `strlen(s) > max_size()`.
280
    */
281
    BOOST_JSON_DECL
282
    string(
283
        char const* s,
284
        storage_ptr sp = {});
285
286
    /** Constructor.
287
288
        Construct the contents with copies of the
289
        characters in the range `{s, s+count)`.
290
        This range can contain null characters.
291
292
        @par Complexity
293
294
        Linear in `count`.
295
296
        @par Exception Safety
297
298
        Strong guarantee.
299
        Calls to `memory_resource::allocate` may throw.
300
301
        @param count The number of characters to copy.
302
303
        @param s A pointer to a character string used to
304
        copy from.
305
306
        @param sp An optional pointer to the
307
        `boost::container::pmr::memory_resource` to use. The container will
308
        acquire shared ownership of the memory resource. The default argument
309
        for this parameter is `{}`.
310
311
        @throw `boost::system::system_error` `count > max_size()`.
312
    */
313
    BOOST_JSON_DECL
314
    explicit
315
    string(
316
        char const* s,
317
        std::size_t count,
318
        storage_ptr sp = {});
319
320
    /** Constructor.
321
322
        Construct the contents with copies of characters
323
        in the range `{first, last)`.
324
325
        @par Complexity
326
327
        Linear in `std::distance(first, last)`.
328
329
        @par Exception Safety
330
331
        Strong guarantee.
332
        Calls to `memory_resource::allocate` may throw.
333
334
        @tparam InputIt The type of the iterators.
335
336
        @par Constraints
337
338
        `InputIt` satisfies __InputIterator__.
339
340
        @param first An input iterator pointing to the
341
        first character to insert, or pointing to the
342
        end of the range.
343
344
        @param last An input iterator pointing to the end
345
        of the range.
346
347
        @param sp An optional pointer to the
348
        `boost::container::pmr::memory_resource` to use. The container will
349
        acquire shared ownership of the memory resource. The default argument
350
        for this parameter is `{}`.
351
352
        @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
353
    */
354
    template<class InputIt
355
    #ifndef BOOST_JSON_DOCS
356
        ,class = is_inputit<InputIt>
357
    #endif
358
    >
359
    explicit
360
    string(
361
        InputIt first,
362
        InputIt last,
363
        storage_ptr sp = {});
364
365
    /** Copy constructor.
366
367
        Construct the contents with a copy of `other`.
368
369
        @par Complexity
370
371
        Linear in `other.size()`.
372
373
        @par Exception Safety
374
375
        Strong guarantee.
376
        Calls to `memory_resource::allocate` may throw.
377
378
        @param other The string to use as a source
379
        to copy from.
380
    */
381
    BOOST_JSON_DECL
382
    string(string const& other);
383
384
    /** Constructor.
385
386
        Construct the contents with a copy of `other`.
387
388
        @par Complexity
389
390
        Linear in `other.size()`.
391
392
        @par Exception Safety
393
394
        Strong guarantee.
395
        Calls to `memory_resource::allocate` may throw.
396
397
        @param other The string to use as a source
398
        to copy from.
399
400
        @param sp An optional pointer to the
401
        `boost::container::pmr::memory_resource` to use. The container will
402
        acquire shared ownership of the memory resource. The default argument
403
        for this parameter is `{}`.
404
    */
405
    BOOST_JSON_DECL
406
    explicit
407
    string(
408
        string const& other,
409
        storage_ptr sp);
410
411
    /** Move constructor.
412
413
        Constructs the string with the contents of `other` using move
414
        semantics. Ownership of the underlying memory is transferred. The
415
        container acquires shared ownership of the
416
        `boost::container::pmr::memory_resource` used by `other`. After
417
        construction, the moved-from string behaves as if newly constructed
418
        with its current memory resource.
419
420
        @par Complexity
421
422
        Constant.
423
424
        @param other The string to move
425
    */
426
    string(string&& other) noexcept
427
0
        : sp_(other.sp_)
428
0
        , impl_(other.impl_)
429
0
    {
430
0
        ::new(&other.impl_) string_impl();
431
0
    }
432
433
    /** Constructor.
434
435
        Construct the contents with those of `other`
436
        using move semantics.
437
438
        @li If `*other.storage() == *sp`, ownership of the underlying memory is
439
        transferred in constant time, with no possibility of exceptions. After
440
        construction, the moved-from string behaves as if newly constructed
441
        with its current `boost::container::pmr::memory_resource`. Otherwise,
442
443
        @li If `*other.storage() != *sp`,
444
        a copy of the characters in `other` is made. In
445
        this case, the moved-from string is not changed.
446
447
        @par Complexity
448
449
        Constant or linear in `other.size()`.
450
451
        @par Exception Safety
452
453
        Strong guarantee.
454
        Calls to `memory_resource::allocate` may throw.
455
456
        @param other The string to assign from.
457
458
        @param sp An optional pointer to the
459
        `boost::container::pmr::memory_resource` to use. The container will
460
        acquire shared ownership of the memory resource. The default argument
461
        for this parameter is `{}`.
462
    */
463
    BOOST_JSON_DECL
464
    explicit
465
    string(
466
        string&& other,
467
        storage_ptr sp);
468
469
    /** Constructor.
470
471
        Construct the contents with those of a
472
        string view. This view can contain
473
        null characters.
474
475
        @par Complexity
476
477
        Linear in `s.size()`.
478
479
        @par Exception Safety
480
481
        Strong guarantee.
482
        Calls to `memory_resource::allocate` may throw.
483
484
        @param s The string view to copy from.
485
486
        @param sp An optional pointer to the
487
        `boost::container::pmr::memory_resource` to use. The container will
488
        acquire shared ownership of the memory resource. The default argument
489
        for this parameter is `{}`.
490
491
        @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
492
    */
493
    BOOST_JSON_DECL
494
    string(
495
        string_view s,
496
        storage_ptr sp = {});
497
498
    //------------------------------------------------------
499
    //
500
    // Assignment
501
    //
502
    //------------------------------------------------------
503
504
    /** Copy assignment.
505
506
        Replace the contents with a copy of `other`.
507
508
        @par Complexity
509
510
        Linear in `other.size()`.
511
512
        @par Exception Safety
513
514
        Strong guarantee.
515
        Calls to `memory_resource::allocate` may throw.
516
517
        @return `*this`
518
519
        @param other The string to use as a source
520
        to copy from.
521
    */
522
    BOOST_JSON_DECL
523
    string&
524
    operator=(string const& other);
525
526
    /** Move assignment.
527
528
        Replace the contents with those of `other`
529
        using move semantics.
530
531
        @li If `&other == this`, do nothing. Otherwise,
532
533
        @li If `*other.storage() == *this->storage()`, ownership of the
534
        underlying memory is transferred in constant time, with no possibility
535
        of exceptions. After construction, the moved-from string behaves as if
536
        newly constructed with its current
537
        `boost::container::pmr::memory_resource`. Otherwise,
538
539
        @li a copy of the characters in `other` is made. In
540
        this case, the moved-from container is not changed.
541
542
        @par Complexity
543
544
        Constant or linear in `other.size()`.
545
546
        @par Exception Safety
547
548
        Strong guarantee.
549
        Calls to `memory_resource::allocate` may throw.
550
551
        @return `*this`
552
553
        @param other The string to use as a source
554
        to move from.
555
    */
556
    BOOST_JSON_DECL
557
    string&
558
    operator=(string&& other);
559
560
    /** Assign a value to the string.
561
562
        Replaces the contents with those of the null
563
        terminated string pointed to by `s`. The length
564
        of the string is determined by the first null
565
        character.
566
567
        @par Complexity
568
569
        Linear in `std::strlen(s)`.
570
571
        @par Exception Safety
572
573
        Strong guarantee.
574
        Calls to `memory_resource::allocate` may throw.
575
576
        @return `*this`
577
578
        @param s The null-terminated character string.
579
580
        @throw `boost::system::system_error` `std::strlen(s) > max_size()`.
581
    */
582
    BOOST_JSON_DECL
583
    string&
584
    operator=(char const* s);
585
586
    /** Assign a value to the string.
587
588
        Replaces the contents with those of a
589
        string view. This view can contain
590
        null characters.
591
592
        @par Complexity
593
594
        Linear in `s.size()`.
595
596
        @par Exception Safety
597
598
        Strong guarantee.
599
        Calls to `memory_resource::allocate` may throw.
600
601
        @return `*this`
602
603
        @param s The string view to copy from.
604
605
        @throw `boost::system::system_error` `s.size() > max_size()`.
606
    */
607
    BOOST_JSON_DECL
608
    string&
609
    operator=(string_view s);
610
611
    //------------------------------------------------------
612
613
    /** Assign characters to a string.
614
615
        Replace the contents with `count` copies of
616
        character `ch`.
617
618
        @par Complexity
619
620
        Linear in `count`.
621
622
        @par Exception Safety
623
624
        Strong guarantee.
625
        Calls to `memory_resource::allocate` may throw.
626
627
        @return `*this`
628
629
        @param count The size of the resulting string.
630
631
        @param ch The value to initialize characters
632
        of the string with.
633
634
        @throw `boost::system::system_error` `count > max_size()`.
635
    */
636
    BOOST_JSON_DECL
637
    string&
638
    assign(
639
        std::size_t count,
640
        char ch);
641
642
    /** Assign characters to a string.
643
644
        Replace the contents with a copy of `other`.
645
646
        @par Complexity
647
648
        Linear in `other.size()`.
649
650
        @par Exception Safety
651
652
        Strong guarantee.
653
        Calls to `memory_resource::allocate` may throw.
654
655
        @return `*this`
656
657
        @param other The string to use as a source
658
        to copy from.
659
    */
660
    BOOST_JSON_DECL
661
    string&
662
    assign(
663
        string const& other);
664
665
    /** Assign characters to a string.
666
667
        Replace the contents with those of `other`
668
        using move semantics.
669
670
        @li If `&other == this`, do nothing. Otherwise,
671
672
        @li If `*other.storage() == *this->storage()`, ownership of the
673
        underlying memory is transferred in constant time, with no possibility
674
        of exceptions. After construction, the moved-from string behaves as if
675
        newly constructed with its current
676
        `boost::container::pmr::memory_resource`, otherwise
677
678
        @li If `*other.storage() != *this->storage()`,
679
        a copy of the characters in `other` is made.
680
        In this case, the moved-from container
681
        is not changed.
682
683
        @par Complexity
684
685
        Constant or linear in `other.size()`.
686
687
        @par Exception Safety
688
689
        Strong guarantee.
690
        Calls to `memory_resource::allocate` may throw.
691
692
        @return `*this`
693
694
        @param other The string to assign from.
695
    */
696
    BOOST_JSON_DECL
697
    string&
698
    assign(string&& other);
699
700
    /** Assign characters to a string.
701
702
        Replaces the contents with copies of the
703
        characters in the range `{s, s+count)`. This
704
        range can contain null characters.
705
706
        @par Complexity
707
708
        Linear in `count`.
709
710
        @par Exception Safety
711
712
        Strong guarantee.
713
        Calls to `memory_resource::allocate` may throw.
714
715
        @return `*this`
716
717
        @param count The number of characters to copy.
718
719
        @param s A pointer to a character string used to
720
        copy from.
721
722
        @throw `boost::system::system_error` `count > max_size()`.
723
    */
724
    BOOST_JSON_DECL
725
    string&
726
    assign(
727
        char const* s,
728
        std::size_t count);
729
730
    /** Assign characters to a string.
731
732
        Replaces the contents with those of the null
733
        terminated string pointed to by `s`. The length
734
        of the string is determined by the first null
735
        character.
736
737
        @par Complexity
738
739
        Linear in `strlen(s)`.
740
741
        @par Exception Safety
742
743
        Strong guarantee.
744
745
        @note
746
747
        Calls to `memory_resource::allocate` may throw.
748
749
        @return `*this`
750
751
        @param s A pointer to a character string used to
752
        copy from.
753
754
        @throw `boost::system::system_error` `strlen(s) > max_size()`.
755
    */
756
    BOOST_JSON_DECL
757
    string&
758
    assign(
759
        char const* s);
760
761
    /** Assign characters to a string.
762
763
        Replaces the contents with copies of characters
764
        in the range `{first, last)`.
765
766
        @par Complexity
767
768
        Linear in `std::distance(first, last)`.
769
770
        @par Exception Safety
771
772
        Strong guarantee.
773
        Calls to `memory_resource::allocate` may throw.
774
775
        @tparam InputIt The type of the iterators.
776
777
        @par Constraints
778
779
        `InputIt` satisfies __InputIterator__.
780
781
        @return `*this`
782
783
        @param first An input iterator pointing to the
784
        first character to insert, or pointing to the
785
        end of the range.
786
787
        @param last An input iterator pointing to the end
788
        of the range.
789
790
        @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
791
    */
792
    template<class InputIt
793
    #ifndef BOOST_JSON_DOCS
794
        ,class = is_inputit<InputIt>
795
    #endif
796
    >
797
    string&
798
    assign(
799
        InputIt first,
800
        InputIt last);
801
802
    /** Assign characters to a string.
803
804
        Replaces the contents with those of a
805
        string view. This view can contain
806
        null characters.
807
808
        @par Complexity
809
810
        Linear in `s.size()`.
811
812
        @par Exception Safety
813
814
        Strong guarantee.
815
        Calls to `memory_resource::allocate` may throw.
816
817
        @return `*this`
818
819
        @param s The string view to copy from.
820
821
        @throw `boost::system::system_error` `s.size() > max_size()`.
822
    */
823
    string&
824
    assign(string_view s)
825
30.3k
    {
826
30.3k
        return assign(s.data(), s.size());
827
30.3k
    }
828
829
    //------------------------------------------------------
830
831
    /** Return the associated memory resource.
832
833
        This returns the `boost::container::pmr::memory_resource` used by
834
        the container.
835
836
        @par Complexity
837
838
        Constant.
839
840
        @par Exception Safety
841
842
        No-throw guarantee.
843
    */
844
    storage_ptr const&
845
    storage() const noexcept
846
0
    {
847
0
        return sp_;
848
0
    }
849
850
    /** Return the associated allocator.
851
852
        This function returns an instance of @ref allocator_type constructed
853
        from the associated `boost::container::pmr::memory_resource`.
854
855
        @par Complexity
856
857
        Constant.
858
859
        @par Exception Safety
860
861
        No-throw guarantee.
862
    */
863
    allocator_type
864
    get_allocator() const noexcept
865
    {
866
        return sp_.get();
867
    }
868
869
    //------------------------------------------------------
870
    //
871
    // Element Access
872
    //
873
    //------------------------------------------------------
874
875
    /** Return a character with bounds checking.
876
877
        Returns `boost::system::result` containing a reference to the character
878
        specified at location `pos`, if `pos` is within the range of the
879
        string. Otherwise the result contains an `error_code`.
880
881
        @par Exception Safety
882
        Strong guarantee.
883
884
        @param pos A zero-based index to access.
885
886
        @par Complexity
887
        Constant.
888
    */
889
    /** @{ */
890
    BOOST_JSON_DECL
891
    system::result<char&>
892
    try_at(std::size_t pos) noexcept;
893
894
    BOOST_JSON_DECL
895
    system::result<char const&>
896
    try_at(std::size_t pos) const noexcept;
897
    /** @} */
898
899
    /** Return a character with bounds checking.
900
901
        Returns a reference to the character specified at
902
        location `pos`.
903
904
        @par Complexity
905
906
        Constant.
907
908
        @par Exception Safety
909
910
        Strong guarantee.
911
912
        @param pos A zero-based index to access.
913
914
        @param loc `source_location` to use in thrown exception; the source
915
            location of the call site by default.
916
917
        @throw `boost::system::system_error` `pos >= size()`.
918
    */
919
    /** @{ */
920
    inline
921
    char&
922
    at(
923
        std::size_t pos,
924
        source_location const& loc = BOOST_CURRENT_LOCATION);
925
926
    BOOST_JSON_DECL
927
    char const&
928
    at(
929
        std::size_t pos,
930
        source_location const& loc = BOOST_CURRENT_LOCATION) const;
931
    /** @} */
932
933
    /** Return a character without bounds checking.
934
935
        Returns a reference to the character specified at
936
        location `pos`.
937
938
        @par Complexity
939
940
        Constant.
941
942
        @par Precondition
943
944
        @code
945
        pos >= size
946
        @endcode
947
948
        @param pos A zero-based index to access.
949
    */
950
    char&
951
    operator[](std::size_t pos)
952
    {
953
        return impl_.data()[pos];
954
    }
955
956
   /**  Return a character without bounds checking.
957
958
        Returns a reference to the character specified at
959
        location `pos`.
960
961
        @par Complexity
962
963
        Constant.
964
965
        @par Precondition
966
967
        @code
968
        pos >= size
969
        @endcode
970
971
        @param pos A zero-based index to access.
972
    */
973
    const char&
974
    operator[](std::size_t pos) const
975
    {
976
        return impl_.data()[pos];
977
    }
978
979
    /** Return the first character.
980
981
        Returns a reference to the first character.
982
983
        @par Complexity
984
985
        Constant.
986
987
        @par Precondition
988
989
        @code
990
        not empty()
991
        @endcode
992
    */
993
    char&
994
    front()
995
    {
996
        return impl_.data()[0];
997
    }
998
999
    /** Return the first character.
1000
1001
        Returns a reference to the first character.
1002
1003
        @par Complexity
1004
1005
        Constant.
1006
1007
        @par Precondition
1008
1009
        @code
1010
        not empty()
1011
        @endcode
1012
    */
1013
    char const&
1014
    front() const
1015
    {
1016
        return impl_.data()[0];
1017
    }
1018
1019
    /** Return the last character.
1020
1021
        Returns a reference to the last character.
1022
1023
        @par Complexity
1024
1025
        Constant.
1026
1027
        @par Precondition
1028
1029
        @code
1030
        not empty()
1031
        @endcode
1032
    */
1033
    char&
1034
    back()
1035
0
    {
1036
0
        return impl_.data()[impl_.size() - 1];
1037
0
    }
1038
1039
    /** Return the last character.
1040
1041
        Returns a reference to the last character.
1042
1043
        @par Complexity
1044
1045
        Constant.
1046
1047
        @par Precondition
1048
1049
        @code
1050
        not empty()
1051
        @endcode
1052
    */
1053
    char const&
1054
    back() const
1055
    {
1056
        return impl_.data()[impl_.size() - 1];
1057
    }
1058
1059
    /** Return the underlying character array directly.
1060
1061
        Returns a pointer to the underlying array
1062
        serving as storage. The value returned is such that
1063
        the range `{data(), data()+size())` is always a
1064
        valid range, even if the container is empty.
1065
1066
        @par Complexity
1067
1068
        Constant.
1069
1070
        @note The value returned from
1071
        this function is never equal to `nullptr`.
1072
    */
1073
    char*
1074
    data() noexcept
1075
35.9k
    {
1076
35.9k
        return impl_.data();
1077
35.9k
    }
1078
1079
    /** Return the underlying character array directly.
1080
1081
        Returns a pointer to the underlying array
1082
        serving as storage.
1083
1084
        @note The value returned is such that
1085
        the range `{data(), data() + size())` is always a
1086
        valid range, even if the container is empty.
1087
        The value returned from
1088
        this function is never equal to `nullptr`.
1089
1090
        @par Complexity
1091
1092
        Constant.
1093
    */
1094
    char const*
1095
    data() const noexcept
1096
35.8k
    {
1097
35.8k
        return impl_.data();
1098
35.8k
    }
1099
1100
    /** Return the underlying character array directly.
1101
1102
        Returns a pointer to the underlying array
1103
        serving as storage. The value returned is such that
1104
        the range `{c_str(), c_str() + size()}` is always a
1105
        valid range, even if the container is empty.
1106
1107
        @par Complexity
1108
1109
        Constant.
1110
1111
        @note The value returned from
1112
        this function is never equal to `nullptr`.
1113
    */
1114
    char const*
1115
    c_str() const noexcept
1116
    {
1117
        return impl_.data();
1118
    }
1119
1120
    /** Convert to a @ref string_view referring to the string.
1121
1122
        Returns a string view to the
1123
        underlying character string. The size of the view
1124
        does not include the null terminator.
1125
1126
        @par Complexity
1127
1128
        Constant.
1129
    */
1130
    operator string_view() const noexcept
1131
0
    {
1132
0
        return {data(), size()};
1133
0
    }
1134
1135
#if ! defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
1136
    /** Convert to a `std::string_view` referring to the string.
1137
1138
        Returns a string view to the underlying character string. The size of
1139
        the view does not include the null terminator.
1140
1141
        This overload is not defined when `BOOST_NO_CXX17_HDR_STRING_VIEW`
1142
        is defined.
1143
1144
        @par Complexity
1145
1146
        Constant.
1147
    */
1148
    operator std::string_view() const noexcept
1149
    {
1150
        return {data(), size()};
1151
    }
1152
#endif
1153
1154
    //------------------------------------------------------
1155
    //
1156
    // Iterators
1157
    //
1158
    //------------------------------------------------------
1159
1160
    /** Return an iterator to the beginning.
1161
1162
        If the container is empty, @ref end() is returned.
1163
1164
        @par Complexity
1165
        Constant.
1166
1167
        @par Exception Safety
1168
        No-throw guarantee.
1169
    */
1170
    iterator
1171
    begin() noexcept
1172
0
    {
1173
0
        return impl_.data();
1174
0
    }
1175
1176
    /** Return an iterator to the beginning.
1177
1178
        If the container is empty, @ref end() is returned.
1179
1180
        @par Complexity
1181
        Constant.
1182
1183
        @par Exception Safety
1184
        No-throw guarantee.
1185
    */
1186
    const_iterator
1187
    begin() const noexcept
1188
    {
1189
        return impl_.data();
1190
    }
1191
1192
    /** Return an iterator to the beginning.
1193
1194
        If the container is empty, @ref cend() is returned.
1195
1196
        @par Complexity
1197
        Constant.
1198
1199
        @par Exception Safety
1200
        No-throw guarantee.
1201
    */
1202
    const_iterator
1203
    cbegin() const noexcept
1204
    {
1205
        return impl_.data();
1206
    }
1207
1208
    /** Return an iterator to the end.
1209
1210
        Returns an iterator to the character
1211
        following the last character of the string.
1212
        This character acts as a placeholder, attempting
1213
        to access it results in undefined behavior.
1214
1215
        @par Complexity
1216
        Constant.
1217
1218
        @par Exception Safety
1219
        No-throw guarantee.
1220
    */
1221
    iterator
1222
    end() noexcept
1223
    {
1224
        return impl_.end();
1225
    }
1226
1227
    /** Return an iterator to the end.
1228
1229
        Returns an iterator to the character following
1230
        the last character of the string.
1231
        This character acts as a placeholder, attempting
1232
        to access it results in undefined behavior.
1233
1234
        @par Complexity
1235
        Constant.
1236
1237
        @par Exception Safety
1238
        No-throw guarantee.
1239
    */
1240
    const_iterator
1241
    end() const noexcept
1242
    {
1243
        return impl_.end();
1244
    }
1245
1246
    /** Return an iterator to the end.
1247
1248
        Returns an iterator to the character following
1249
        the last character of the string.
1250
        This character acts as a placeholder, attempting
1251
        to access it results in undefined behavior.
1252
1253
        @par Complexity
1254
        Constant.
1255
1256
        @par Exception Safety
1257
        No-throw guarantee.
1258
    */
1259
    const_iterator
1260
    cend() const noexcept
1261
    {
1262
        return impl_.end();
1263
    }
1264
1265
    /** Return a reverse iterator to the first character of the reversed container.
1266
1267
        Returns the pointed-to character that
1268
        corresponds to the last character of the
1269
        non-reversed container.
1270
        If the container is empty, @ref rend() is returned.
1271
1272
        @par Complexity
1273
        Constant.
1274
1275
        @par Exception Safety
1276
        No-throw guarantee.
1277
    */
1278
    reverse_iterator
1279
    rbegin() noexcept
1280
    {
1281
        return reverse_iterator(impl_.end());
1282
    }
1283
1284
    /** Return a reverse iterator to the first character of the reversed container.
1285
1286
        Returns the pointed-to character that
1287
        corresponds to the last character of the
1288
        non-reversed container.
1289
        If the container is empty, @ref rend() is returned.
1290
1291
        @par Complexity
1292
        Constant.
1293
1294
        @par Exception Safety
1295
        No-throw guarantee.
1296
    */
1297
    const_reverse_iterator
1298
    rbegin() const noexcept
1299
    {
1300
        return const_reverse_iterator(impl_.end());
1301
    }
1302
1303
    /** Return a reverse iterator to the first character of the reversed container.
1304
1305
        Returns the pointed-to character that
1306
        corresponds to the last character of the
1307
        non-reversed container.
1308
        If the container is empty, @ref crend() is returned.
1309
1310
        @par Complexity
1311
        Constant.
1312
1313
        @par Exception Safety
1314
        No-throw guarantee.
1315
    */
1316
    const_reverse_iterator
1317
    crbegin() const noexcept
1318
    {
1319
        return const_reverse_iterator(impl_.end());
1320
    }
1321
1322
    /** Return a reverse iterator to the character following the last character of the reversed container.
1323
1324
        Returns the pointed-to character that corresponds
1325
        to the character preceding the first character of
1326
        the non-reversed container.
1327
        This character acts as a placeholder, attempting
1328
        to access it results in undefined behavior.
1329
1330
        @par Complexity
1331
        Constant.
1332
1333
        @par Exception Safety
1334
        No-throw guarantee.
1335
    */
1336
    reverse_iterator
1337
    rend() noexcept
1338
    {
1339
        return reverse_iterator(begin());
1340
    }
1341
1342
    /** Return a reverse iterator to the character following the last character of the reversed container.
1343
1344
        Returns the pointed-to character that corresponds
1345
        to the character preceding the first character of
1346
        the non-reversed container.
1347
        This character acts as a placeholder, attempting
1348
        to access it results in undefined behavior.
1349
1350
        @par Complexity
1351
        Constant.
1352
1353
        @par Exception Safety
1354
        No-throw guarantee.
1355
    */
1356
    const_reverse_iterator
1357
    rend() const noexcept
1358
    {
1359
        return const_reverse_iterator(begin());
1360
    }
1361
1362
    /** Return a reverse iterator to the character following the last character of the reversed container.
1363
1364
        Returns the pointed-to character that corresponds
1365
        to the character preceding the first character of
1366
        the non-reversed container.
1367
        This character acts as a placeholder, attempting
1368
        to access it results in undefined behavior.
1369
1370
        @par Complexity
1371
        Constant.
1372
1373
        @par Exception Safety
1374
        No-throw guarantee.
1375
    */
1376
    const_reverse_iterator
1377
    crend() const noexcept
1378
    {
1379
        return const_reverse_iterator(begin());
1380
    }
1381
1382
    //------------------------------------------------------
1383
    //
1384
    // Capacity
1385
    //
1386
    //------------------------------------------------------
1387
1388
    /** Check if the string has no characters.
1389
1390
        Returns `true` if there are no characters in
1391
        the string, i.e. @ref size() returns 0.
1392
1393
        @par Complexity
1394
1395
        Constant.
1396
    */
1397
    bool
1398
    empty() const noexcept
1399
    {
1400
        return impl_.size() == 0;
1401
    }
1402
1403
    /** Return the number of characters in the string.
1404
1405
        The value returned does not include the
1406
        null terminator, which is always present.
1407
1408
        @par Complexity
1409
1410
        Constant.
1411
    */
1412
    std::size_t
1413
    size() const noexcept
1414
35.8k
    {
1415
35.8k
        return impl_.size();
1416
35.8k
    }
1417
1418
    /** Return the maximum number of characters any string can hold.
1419
1420
        The maximum is an implementation-defined number.
1421
        This value is a theoretical limit; at runtime,
1422
        the actual maximum size may be less due to
1423
        resource limits.
1424
1425
        @par Complexity
1426
1427
        Constant.
1428
    */
1429
    static
1430
    constexpr
1431
    std::size_t
1432
    max_size() noexcept
1433
0
    {
1434
0
        return string_impl::max_size();
1435
0
    }
1436
1437
    /** Return the number of characters that can be held without a reallocation.
1438
1439
        This number represents the largest number of
1440
        characters the currently allocated storage can contain.
1441
        This number may be larger than the value returned
1442
        by @ref size().
1443
1444
        @par Complexity
1445
1446
        Constant.
1447
    */
1448
    std::size_t
1449
    capacity() const noexcept
1450
17.9k
    {
1451
17.9k
        return impl_.capacity();
1452
17.9k
    }
1453
1454
    /** Increase the capacity to at least a certain amount.
1455
1456
        This increases the capacity of the array to a value
1457
        that is greater than or equal to `new_capacity`. If
1458
        `new_capacity > capacity()`, new memory is
1459
        allocated. Otherwise, the call has no effect.
1460
        The number of elements and therefore the
1461
        @ref size() of the container is not changed.
1462
1463
        @par Complexity
1464
1465
        At most, linear in @ref size().
1466
1467
        @par Exception Safety
1468
1469
        Strong guarantee.
1470
        Calls to `memory_resource::allocate` may throw.
1471
1472
        @note
1473
1474
        If new memory is allocated, all iterators including
1475
        any past-the-end iterators, and all references to
1476
        the elements are invalidated. Otherwise, no
1477
        iterators or references are invalidated.
1478
1479
        @param new_capacity The new capacity of the array.
1480
1481
        @throw `boost::system::system_error` `new_capacity > max_size()`.
1482
    */
1483
    void
1484
    reserve(std::size_t new_capacity)
1485
17.9k
    {
1486
17.9k
        if(new_capacity <= capacity())
1487
4.63k
            return;
1488
13.3k
        reserve_impl(new_capacity);
1489
13.3k
    }
1490
1491
    /** Request the removal of unused capacity.
1492
1493
        This performs a non-binding request to reduce
1494
        @ref capacity() to @ref size(). The request may
1495
        or may not be fulfilled.
1496
1497
        @par Complexity
1498
1499
        At most, linear in @ref size().
1500
1501
        @note If reallocation occurs, all iterators
1502
        including  any past-the-end iterators, and all
1503
        references to characters are invalidated.
1504
        Otherwise, no iterators or references are
1505
        invalidated.
1506
    */
1507
    BOOST_JSON_DECL
1508
    void
1509
    shrink_to_fit();
1510
1511
    //------------------------------------------------------
1512
    //
1513
    // Operations
1514
    //
1515
    //------------------------------------------------------
1516
1517
    /** Clear the contents.
1518
1519
        Erases all characters from the string. After this
1520
        call, @ref size() returns zero but @ref capacity()
1521
        is unchanged.
1522
1523
        @par Complexity
1524
1525
        Linear in @ref size().
1526
1527
        @note All references, pointers, or iterators
1528
        referring to contained elements are invalidated.
1529
        Any past-the-end iterators are also invalidated.
1530
    */
1531
    BOOST_JSON_DECL
1532
    void
1533
    clear() noexcept;
1534
1535
    //------------------------------------------------------
1536
1537
    /** Insert a string.
1538
1539
        Inserts the `string_view` `sv` at the position `pos`.
1540
1541
        @par Exception Safety
1542
1543
        Strong guarantee.
1544
1545
        @note All references, pointers, or iterators
1546
        referring to contained elements are invalidated.
1547
        Any past-the-end iterators are also invalidated.
1548
1549
        @return `*this`
1550
1551
        @param pos The index to insert at.
1552
1553
        @param sv The `string_view` to insert.
1554
1555
        @throw `boost::system::system_error` `size() + s.size() > max_size()`.
1556
        @throw `boost::system::system_error` `pos > size()`.
1557
    */
1558
    BOOST_JSON_DECL
1559
    string&
1560
    insert(
1561
        std::size_t pos,
1562
        string_view sv);
1563
1564
    /** Insert a character.
1565
1566
        Inserts `count` copies of `ch` at the position `pos`.
1567
1568
        @par Exception Safety
1569
1570
        Strong guarantee.
1571
1572
        @note All references, pointers, or iterators
1573
        referring to contained elements are invalidated.
1574
        Any past-the-end iterators are also invalidated.
1575
1576
        @return `*this`
1577
1578
        @param pos The index to insert at.
1579
1580
        @param count The number of characters to insert.
1581
1582
        @param ch The character to insert.
1583
1584
        @throw `boost::system::system_error` `size() + count > max_size()`.
1585
        @throw `boost::system::system_error` `pos > size()`.
1586
    */
1587
    BOOST_JSON_DECL
1588
    string&
1589
    insert(
1590
        std::size_t pos,
1591
        std::size_t count,
1592
        char ch);
1593
1594
    /** Insert a character.
1595
1596
        Inserts the character `ch` before the character
1597
        at index `pos`.
1598
1599
        @par Exception Safety
1600
1601
        Strong guarantee.
1602
1603
        @note All references, pointers, or iterators
1604
        referring to contained elements are invalidated.
1605
        Any past-the-end iterators are also invalidated.
1606
1607
        @return `*this`
1608
1609
        @param pos The index to insert at.
1610
1611
        @param ch The character to insert.
1612
1613
        @throw `boost::system::system_error` `size() + 1 > max_size()`.
1614
        @throw `boost::system::system_error` `pos > size()`.
1615
    */
1616
    string&
1617
    insert(
1618
        size_type pos,
1619
        char ch)
1620
    {
1621
        return insert(pos, 1, ch);
1622
    }
1623
1624
    /** Insert a range of characters.
1625
1626
        Inserts characters from the range `{first, last)`
1627
        before the character at index `pos`.
1628
1629
        @par Precondition
1630
1631
        `{first, last)` is a valid range.
1632
1633
        @par Exception Safety
1634
1635
        Strong guarantee.
1636
1637
        @note All references, pointers, or iterators
1638
        referring to contained elements are invalidated.
1639
        Any past-the-end iterators are also invalidated.
1640
1641
        @tparam InputIt The type of the iterators.
1642
1643
        @par Constraints
1644
1645
        `InputIt` satisfies __InputIterator__.
1646
1647
        @return `*this`
1648
1649
        @param pos The index to insert at.
1650
1651
        @param first The beginning of the character range.
1652
1653
        @param last The end of the character range.
1654
1655
        @throw `boost::system::system_error` `size() + insert_count > max_size()`.
1656
        @throw `boost::system::system_error` `pos > size()`.
1657
    */
1658
    template<class InputIt
1659
    #ifndef BOOST_JSON_DOCS
1660
        ,class = is_inputit<InputIt>
1661
    #endif
1662
    >
1663
    string&
1664
    insert(
1665
        size_type pos,
1666
        InputIt first,
1667
        InputIt last);
1668
1669
    //------------------------------------------------------
1670
1671
    /** Erase characters from the string.
1672
1673
        Erases `num` characters from the string, starting
1674
        at `pos`.  `num` is determined as the smaller of
1675
        `count` and `size() - pos`.
1676
1677
        @par Exception Safety
1678
1679
        Strong guarantee.
1680
1681
        @note All references, pointers, or iterators
1682
        referring to contained elements are invalidated.
1683
        Any past-the-end iterators are also invalidated.
1684
1685
        @return `*this`
1686
1687
        @param pos The index to erase at.
1688
        The default argument for this parameter is `0`.
1689
1690
        @param count The number of characters to erase.
1691
        The default argument for this parameter
1692
        is @ref npos.
1693
1694
        @throw `boost::system::system_error` `pos > size()`.
1695
    */
1696
    BOOST_JSON_DECL
1697
    string&
1698
    erase(
1699
        std::size_t pos = 0,
1700
        std::size_t count = npos);
1701
1702
    /** Erase a character from the string.
1703
1704
        Erases the character at `pos`.
1705
1706
        @par Precondition
1707
1708
        @code
1709
        pos >= data() && pos <= data() + size()
1710
        @endcode
1711
1712
        @par Exception Safety
1713
1714
        Strong guarantee.
1715
1716
        @note All references, pointers, or iterators
1717
        referring to contained elements are invalidated.
1718
        Any past-the-end iterators are also invalidated.
1719
1720
        @return An iterator referring to character
1721
        immediately following the erased character, or
1722
        @ref end() if one does not exist.
1723
1724
        @param pos An iterator referring to the
1725
        character to erase.
1726
    */
1727
    BOOST_JSON_DECL
1728
    iterator
1729
    erase(const_iterator pos);
1730
1731
    /** Erase a range from the string.
1732
1733
        Erases the characters in the range `{first, last)`.
1734
1735
        @par Precondition
1736
1737
        `{first, last}` shall be valid within
1738
        @code
1739
        {data(), data() + size()}
1740
        @endcode
1741
1742
        @par Exception Safety
1743
1744
        Strong guarantee.
1745
1746
        @note All references, pointers, or iterators
1747
        referring to contained elements are invalidated.
1748
        Any past-the-end iterators are also invalidated.
1749
1750
        @return An iterator referring to the character
1751
        `last` previously referred to, or @ref end()
1752
        if one does not exist.
1753
1754
        @param first An iterator representing the first
1755
        character to erase.
1756
1757
        @param last An iterator one past the last
1758
        character to erase.
1759
    */
1760
    BOOST_JSON_DECL
1761
    iterator
1762
    erase(
1763
        const_iterator first,
1764
        const_iterator last);
1765
1766
    //------------------------------------------------------
1767
1768
    /** Append a character.
1769
1770
        Appends a character to the end of the string.
1771
1772
        @par Exception Safety
1773
1774
        Strong guarantee.
1775
1776
        @param ch The character to append.
1777
1778
        @throw `boost::system::system_error` `size() + 1 > max_size()`.
1779
    */
1780
    BOOST_JSON_DECL
1781
    void
1782
    push_back(char ch);
1783
1784
    /** Remove the last character.
1785
1786
        Removes a character from the end of the string.
1787
1788
        @par Precondition
1789
1790
        @code
1791
        not empty()
1792
        @endcode
1793
    */
1794
    BOOST_JSON_DECL
1795
    void
1796
    pop_back();
1797
1798
    //------------------------------------------------------
1799
1800
    /** Append characters to the string.
1801
1802
        Appends `count` copies of `ch` to the end of
1803
        the string.
1804
1805
        @par Exception Safety
1806
1807
        Strong guarantee.
1808
1809
        @return `*this`
1810
1811
        @param count The number of characters to append.
1812
1813
        @param ch The character to append.
1814
1815
        @throw `boost::system::system_error` `size() + count > max_size()`.
1816
    */
1817
    BOOST_JSON_DECL
1818
    string&
1819
    append(
1820
        std::size_t count,
1821
        char ch);
1822
1823
    /** Append a string to the string.
1824
1825
        Appends `sv` the end of the string.
1826
1827
        @par Exception Safety
1828
1829
        Strong guarantee.
1830
1831
        @return `*this`
1832
1833
        @param sv The `string_view` to append.
1834
1835
        @throw `boost::system::system_error` `size() + s.size() > max_size()`.
1836
    */
1837
    BOOST_JSON_DECL
1838
    string&
1839
    append(string_view sv);
1840
1841
    /** Append a range of characters.
1842
1843
        Appends characters from the range `{first, last)`
1844
        to the end of the string.
1845
1846
        @par Precondition
1847
1848
        `{first, last)` shall be a valid range
1849
1850
        @par Exception Safety
1851
1852
        Strong guarantee.
1853
1854
        @tparam InputIt The type of the iterators.
1855
1856
        @par Constraints
1857
1858
        `InputIt` satisfies __InputIterator__.
1859
1860
        @return `*this`
1861
1862
        @param first An iterator representing the
1863
        first character to append.
1864
1865
        @param last An iterator one past the
1866
        last character to append.
1867
1868
        @throw `boost::system::system_error` `size() + insert_count > max_size()`.
1869
    */
1870
    template<class InputIt
1871
    #ifndef BOOST_JSON_DOCS
1872
        ,class = is_inputit<InputIt>
1873
    #endif
1874
    >
1875
    string&
1876
    append(InputIt first, InputIt last);
1877
1878
    //------------------------------------------------------
1879
1880
    /** Append characters from a string.
1881
1882
        Appends `{sv.begin(), sv.end())` to the end of
1883
        the string.
1884
1885
        @par Exception Safety
1886
1887
        Strong guarantee.
1888
1889
        @return `*this`
1890
1891
        @param sv The `string_view` to append.
1892
1893
        @throw `boost::system::system_error` `size() + sv.size() > max_size()`.
1894
    */
1895
    string&
1896
    operator+=(string_view sv)
1897
    {
1898
        return append(sv);
1899
    }
1900
1901
    /** Append a character.
1902
1903
        Appends a character to the end of the string.
1904
1905
        @par Exception Safety
1906
1907
        Strong guarantee.
1908
1909
        @param ch The character to append.
1910
1911
        @throw `boost::system::system_error` `size() + 1 > max_size()`.
1912
    */
1913
    string&
1914
    operator+=(char ch)
1915
    {
1916
        push_back(ch);
1917
        return *this;
1918
    }
1919
1920
    //------------------------------------------------------
1921
1922
    /** Compare a string with the string.
1923
1924
        Let `comp` be
1925
        `std::char_traits<char>::compare(data(), sv.data(), std::min(size(), sv.size())`.
1926
        If `comp != 0`, then the result is `comp`. Otherwise,
1927
        the result is `0` if `size() == sv.size()`,
1928
        `-1` if `size() < sv.size()`, and `1` otherwise.
1929
1930
        @par Complexity
1931
1932
        Linear.
1933
1934
        @return The result of lexicographically comparing
1935
        the characters of `sv` and the string.
1936
1937
        @param sv The `string_view` to compare.
1938
    */
1939
    int
1940
    compare(string_view sv) const noexcept
1941
    {
1942
        return subview().compare(sv);
1943
    }
1944
1945
    //------------------------------------------------------
1946
1947
    /** Return whether the string begins with a string.
1948
1949
        Returns `true` if the string begins with `s`,
1950
        and `false` otherwise.
1951
1952
        @par Complexity
1953
1954
        Linear.
1955
1956
        @param s The `string_view` to check for.
1957
    */
1958
    bool
1959
    starts_with(string_view s) const noexcept
1960
    {
1961
        return subview(0, s.size()) == s;
1962
    }
1963
1964
    /** Return whether the string begins with a character.
1965
1966
        Returns `true` if the string begins with `ch`,
1967
        and `false` otherwise.
1968
1969
        @par Complexity
1970
1971
        Constant.
1972
1973
        @param ch The character to check for.
1974
    */
1975
    bool
1976
    starts_with(char ch) const noexcept
1977
    {
1978
        return ! empty() && front() == ch;
1979
    }
1980
1981
    /** Return whether the string end with a string.
1982
1983
        Returns `true` if the string end with `s`,
1984
        and `false` otherwise.
1985
1986
        @par Complexity
1987
1988
        Linear.
1989
1990
        @param s The string to check for.
1991
    */
1992
    bool
1993
    ends_with(string_view s) const noexcept
1994
    {
1995
        return size() >= s.size() &&
1996
            subview(size() - s.size()) == s;
1997
    }
1998
1999
    /** Return whether the string ends with a character.
2000
2001
        Returns `true` if the string ends with `ch`,
2002
        and `false` otherwise.
2003
2004
        @par Complexity
2005
2006
        Constant.
2007
2008
        @param ch The character to check for.
2009
    */
2010
    bool
2011
    ends_with(char ch) const noexcept
2012
    {
2013
        return ! empty() && back() == ch;
2014
    }
2015
2016
    //------------------------------------------------------
2017
2018
    /** Replace a substring with a string.
2019
2020
        Replaces `rcount` characters starting at index
2021
        `pos` with those of `sv`, where `rcount` is
2022
        `std::min(count, size() - pos)`.
2023
2024
        @par Exception Safety
2025
2026
        Strong guarantee.
2027
2028
        @note All references, pointers, or iterators
2029
        referring to contained elements are invalidated.
2030
        Any past-the-end iterators are also invalidated.
2031
2032
        @return `*this`
2033
2034
        @param pos The index to replace at.
2035
2036
        @param count The number of characters to replace.
2037
2038
        @param sv The `string_view` to replace with.
2039
2040
        @throw `boost::system::system_error` `size() + (sv.size() - rcount) > max_size()`.
2041
        @throw `boost::system::system_error` `pos > size()`.
2042
    */
2043
    BOOST_JSON_DECL
2044
    string&
2045
    replace(
2046
        std::size_t pos,
2047
        std::size_t count,
2048
        string_view sv);
2049
2050
    /** Replace a range with a string.
2051
2052
        Replaces the characters in the range
2053
        `{first, last)` with those of `sv`.
2054
2055
        @par Precondition
2056
2057
        `{first, last)` is a valid range.
2058
2059
        @par Exception Safety
2060
2061
        Strong guarantee.
2062
2063
        @note All references, pointers, or iterators
2064
        referring to contained elements are invalidated.
2065
        Any past-the-end iterators are also invalidated.
2066
2067
        @return `*this`
2068
2069
        @param first An iterator referring to the first
2070
        character to replace.
2071
2072
        @param last An iterator one past the end of
2073
        the last character to replace.
2074
2075
        @param sv The `string_view` to replace with.
2076
2077
        @throw `boost::system::system_error` `size() + (sv.size() - std::distance(first, last)) > max_size()`.
2078
    */
2079
    string&
2080
    replace(
2081
        const_iterator first,
2082
        const_iterator last,
2083
        string_view sv)
2084
    {
2085
        return replace(first - begin(), last - first, sv);
2086
    }
2087
2088
    /** Replace a range with a range.
2089
2090
        Replaces the characters in the range
2091
        `{first, last)` with those of `{first2, last2)`.
2092
2093
        @par Precondition
2094
2095
        `{first, last)` is a valid range.
2096
2097
        `{first2, last2)` is a valid range.
2098
2099
        @par Exception Safety
2100
2101
        Strong guarantee.
2102
2103
        @note All references, pointers, or iterators
2104
        referring to contained elements are invalidated.
2105
        Any past-the-end iterators are also invalidated.
2106
2107
        @tparam InputIt The type of the iterators.
2108
2109
        @par Constraints
2110
2111
        `InputIt` satisfies __InputIterator__.
2112
2113
        @return `*this`
2114
2115
        @param first An iterator referring to the first
2116
        character to replace.
2117
2118
        @param last An iterator one past the end of
2119
        the last character to replace.
2120
2121
        @param first2 An iterator referring to the first
2122
        character to replace with.
2123
2124
        @param last2 An iterator one past the end of
2125
        the last character to replace with.
2126
2127
        @throw `boost::system::system_error` `size() + (inserted - std::distance(first, last)) > max_size()`.
2128
    */
2129
    template<class InputIt
2130
    #ifndef BOOST_JSON_DOCS
2131
        ,class = is_inputit<InputIt>
2132
    #endif
2133
    >
2134
    string&
2135
    replace(
2136
        const_iterator first,
2137
        const_iterator last,
2138
        InputIt first2,
2139
        InputIt last2);
2140
2141
    /** Replace a substring with copies of a character.
2142
2143
        Replaces `rcount` characters starting at index
2144
        `pos`with `count2` copies of `ch`, where
2145
        `rcount` is `std::min(count, size() - pos)`.
2146
2147
        @par Exception Safety
2148
2149
        Strong guarantee.
2150
2151
        @note All references, pointers, or iterators
2152
        referring to contained elements are invalidated.
2153
        Any past-the-end iterators are also invalidated.
2154
2155
        @return `*this`
2156
2157
        @param pos The index to replace at.
2158
2159
        @param count The number of characters to replace.
2160
2161
        @param count2 The number of characters to
2162
        replace with.
2163
2164
        @param ch The character to replace with.
2165
2166
        @throw `boost::system::system_error` `size() + (count2 - rcount) > max_size()`.
2167
        @throw `boost::system::system_error` `pos > size()`.
2168
    */
2169
    BOOST_JSON_DECL
2170
    string&
2171
    replace(
2172
        std::size_t pos,
2173
        std::size_t count,
2174
        std::size_t count2,
2175
        char ch);
2176
2177
    /** Replace a range with copies of a character.
2178
2179
        Replaces the characters in the range
2180
        `{first, last)` with `count` copies of `ch`.
2181
2182
        @par Precondition
2183
2184
        `{first, last)` is a valid range.
2185
2186
        @par Exception Safety
2187
2188
        Strong guarantee.
2189
2190
        @note All references, pointers, or iterators
2191
        referring to contained elements are invalidated.
2192
        Any past-the-end iterators are also invalidated.
2193
2194
        @return `*this`
2195
2196
        @param first An iterator referring to the first
2197
        character to replace.
2198
2199
        @param last An iterator one past the end of
2200
        the last character to replace.
2201
2202
        @param count The number of characters to
2203
        replace with.
2204
2205
        @param ch The character to replace with.
2206
2207
        @throw `boost::system::system_error` `size() + (count - std::distance(first, last)) > max_size()`.
2208
    */
2209
    string&
2210
    replace(
2211
        const_iterator first,
2212
        const_iterator last,
2213
        std::size_t count,
2214
        char ch)
2215
    {
2216
        return replace(first - begin(), last - first, count, ch);
2217
    }
2218
2219
    //------------------------------------------------------
2220
2221
    /** Return a view.
2222
2223
        Returns a view of a substring.
2224
2225
        @par Exception Safety
2226
2227
        Strong guarantee.
2228
2229
        @return `this->subview().substr(pos, count)`
2230
2231
        @param pos The index to being the substring at.
2232
        The default argument for this parameter is `0`.
2233
2234
        @param count The length of the substring.
2235
        The default argument for this parameter
2236
        is @ref npos.
2237
2238
        @throw `boost::system::system_error` `pos > size()`.
2239
    */
2240
    string_view
2241
    subview(
2242
        std::size_t pos
2243
        ,std::size_t count = npos) const
2244
    {
2245
        return subview().substr(pos, count);
2246
    }
2247
2248
    /** Return a view.
2249
2250
        Returns a view of the whole string.
2251
2252
        @par Exception Safety
2253
        No-throw guarantee.
2254
2255
        @return `string_view(this->data(), this->size())`.
2256
    */
2257
    string_view
2258
    subview() const noexcept
2259
0
    {
2260
0
        return string_view( data(), size() );
2261
0
    }
2262
2263
    //------------------------------------------------------
2264
2265
    /** Copy a substring to another string.
2266
2267
        Copies `std::min(count, size() - pos)` characters
2268
        starting at index `pos` to the string pointed
2269
        to by `dest`.
2270
2271
        @note The resulting string is not null terminated.
2272
2273
        @return The number of characters copied.
2274
2275
        @param count The number of characters to copy.
2276
2277
        @param dest The string to copy to.
2278
2279
        @param pos The index to begin copying from. The
2280
        default argument for this parameter is `0`.
2281
2282
        @throw `boost::system::system_error` `pos > max_size()`.
2283
    */
2284
    std::size_t
2285
    copy(
2286
        char* dest,
2287
        std::size_t count,
2288
        std::size_t pos = 0) const
2289
    {
2290
        return subview().copy(dest, count, pos);
2291
    }
2292
2293
    //------------------------------------------------------
2294
2295
    /** Change the size of the string.
2296
2297
        Resizes the string to contain `count` characters.
2298
        If `count > size()`, characters with the value `0`
2299
        are appended. Otherwise, `size()` is reduced
2300
        to `count`.
2301
2302
        @param count The size to resize the string to.
2303
2304
        @throw `boost::system::system_error` `count > max_size()`.
2305
    */
2306
    void
2307
    resize(std::size_t count)
2308
    {
2309
        resize(count, 0);
2310
    }
2311
2312
    /** Change the size of the string.
2313
2314
        Resizes the string to contain `count` characters.
2315
        If `count > size()`, copies of `ch` are
2316
        appended. Otherwise, `size()` is reduced
2317
        to `count`.
2318
2319
        @param count The size to resize the string to.
2320
2321
        @param ch The characters to append if the size
2322
        increases.
2323
2324
        @throw `boost::system::system_error` `count > max_size()`.
2325
    */
2326
    BOOST_JSON_DECL
2327
    void
2328
    resize(std::size_t count, char ch);
2329
2330
    /** Increase size without changing capacity.
2331
2332
        This increases the size of the string by `n`
2333
        characters, adjusting the position of the
2334
        terminating null for the new size. The new
2335
        characters remain uninitialized. This function
2336
        may be used to append characters directly into
2337
        the storage between `end()` and
2338
        `data() + capacity()`.
2339
2340
        @par Precondition
2341
2342
        @code
2343
        count <= capacity() - size()
2344
        @endcode
2345
2346
        @param n The amount to increase the size by.
2347
    */
2348
    void
2349
    grow(std::size_t n) noexcept
2350
17.9k
    {
2351
17.9k
        BOOST_ASSERT(
2352
17.9k
            n <= impl_.capacity() - impl_.size());
2353
17.9k
        impl_.term(impl_.size() + n);
2354
17.9k
    }
2355
2356
    //------------------------------------------------------
2357
2358
    /** Swap the contents.
2359
2360
        Exchanges the contents of this string with another string. Ownership of
2361
        the respective `boost::container::pmr::memory_resource` objects is not
2362
        transferred.
2363
2364
        @li If `&other == this`, do nothing. Otherwise,
2365
2366
        @li if `*other.storage() == *this->storage()`,
2367
        ownership of the underlying memory is swapped in
2368
        constant time, with no possibility of exceptions.
2369
        All iterators and references remain valid. Otherwise,
2370
2371
        @li the contents are logically swapped by making copies,
2372
        which can throw. In this case all iterators and
2373
        references are invalidated.
2374
2375
        @par Complexity
2376
2377
        Constant or linear in @ref size() plus
2378
        `other.size()`.
2379
2380
        @par Exception Safety
2381
2382
        Strong guarantee.
2383
        Calls to `memory_resource::allocate` may throw.
2384
    */
2385
    BOOST_JSON_DECL
2386
    void
2387
    swap(string& other);
2388
2389
    /** Exchange the given values.
2390
2391
        Exchanges the contents of the string `lhs` with another string `rhs`.
2392
        Ownership of the respective `boost::container::pmr::memory_resource`
2393
        objects is not transferred.
2394
2395
        @li If `&lhs == &rhs`, do nothing. Otherwise,
2396
2397
        @li if `*lhs.storage() == *rhs.storage()`,
2398
        ownership of the underlying memory is swapped in
2399
        constant time, with no possibility of exceptions.
2400
        All iterators and references remain valid. Otherwise,
2401
2402
        @li the contents are logically swapped by making a copy,
2403
        which can throw. In this case all iterators and
2404
        references are invalidated.
2405
2406
        @par Effects
2407
        @code
2408
        lhs.swap( rhs );
2409
        @endcode
2410
2411
        @par Complexity
2412
        Constant or linear in `lhs.size() + rhs.size()`.
2413
2414
        @par Exception Safety
2415
        Strong guarantee.
2416
        Calls to `memory_resource::allocate` may throw.
2417
2418
        @param lhs The string to exchange.
2419
2420
        @param rhs The string to exchange.
2421
2422
        @see @ref string::swap
2423
    */
2424
    friend
2425
    void
2426
    swap(string& lhs, string& rhs)
2427
    {
2428
        lhs.swap(rhs);
2429
    }
2430
    //------------------------------------------------------
2431
    //
2432
    // Search
2433
    //
2434
    //------------------------------------------------------
2435
2436
    /** Find the first occurrence of a string within the string.
2437
2438
        Returns the lowest index `idx` greater than or equal
2439
        to `pos` where each element of `sv`  is equal to
2440
        that of `{begin() + idx, begin() + idx + sv.size())`
2441
        if one exists, and @ref npos otherwise.
2442
2443
        @par Complexity
2444
2445
        Linear.
2446
2447
        @return The first occurrence of `sv` within the
2448
        string starting at the index `pos`, or @ref npos
2449
        if none exists.
2450
2451
        @param sv The `string_view` to search for.
2452
2453
        @param pos The index to start searching at.
2454
        The default argument for this parameter is `0`.
2455
    */
2456
    std::size_t
2457
    find(
2458
        string_view sv,
2459
        std::size_t pos = 0) const noexcept
2460
    {
2461
        return subview().find(sv, pos);
2462
    }
2463
2464
    /** Find the first occurrence of a character within the string.
2465
2466
        Returns the index corrosponding to the first
2467
        occurrence of `ch` within `{begin() + pos, end())`
2468
        if it exists, and @ref npos otherwise.
2469
2470
        @par Complexity
2471
2472
        Linear.
2473
2474
        @return The first occurrence of `ch` within the
2475
        string starting at the index `pos`, or @ref npos
2476
        if none exists.
2477
2478
        @param ch The character to search for.
2479
2480
        @param pos The index to start searching at.
2481
        The default argument for this parameter is `0`.
2482
    */
2483
    std::size_t
2484
    find(
2485
        char ch,
2486
        std::size_t pos = 0) const noexcept
2487
    {
2488
        return subview().find(ch, pos);
2489
    }
2490
2491
    //------------------------------------------------------
2492
2493
    /** Find the last occurrence of a string within the string.
2494
2495
        Returns the highest index `idx` less than or equal
2496
        to `pos` where each element of `sv` is equal to that
2497
        of `{begin() + idx, begin() + idx + sv.size())`
2498
        if one exists, and @ref npos otherwise.
2499
2500
        @par Complexity
2501
2502
        Linear.
2503
2504
        @return The last occurrence of `sv` within the
2505
        string starting before or at the index `pos`,
2506
        or @ref npos if none exists.
2507
2508
        @param sv The `string_view` to search for.
2509
2510
        @param pos The index to start searching at.
2511
        The default argument for this parameter
2512
        is @ref npos.
2513
    */
2514
    std::size_t
2515
    rfind(
2516
        string_view sv,
2517
        std::size_t pos = npos) const noexcept
2518
    {
2519
        return subview().rfind(sv, pos);
2520
    }
2521
2522
    /** Find the last occurrence of a character within the string.
2523
2524
        Returns index corrosponding to the last occurrence
2525
        of `ch` within `{begin(), begin() + pos}` if it
2526
        exists, and @ref npos otherwise.
2527
2528
        @par Complexity
2529
2530
        Linear.
2531
2532
        @return The last occurrence of `ch` within the
2533
        string starting before or at the index `pos`,
2534
        or @ref npos if none exists.
2535
2536
        @param ch The character to search for.
2537
2538
        @param pos The index to stop searching at.
2539
        The default argument for this parameter
2540
        is @ref npos.
2541
    */
2542
    std::size_t
2543
    rfind(
2544
        char ch,
2545
        std::size_t pos = npos) const noexcept
2546
    {
2547
        return subview().rfind(ch, pos);
2548
    }
2549
2550
    //------------------------------------------------------
2551
2552
    /** Find the first occurrence of any of the characters within the string.
2553
2554
        Returns the index corrosponding to the first
2555
        occurrence of any of the characters of `sv`
2556
        within `{begin() + pos, end())` if it exists,
2557
        and @ref npos otherwise.
2558
2559
        @par Complexity
2560
2561
        Linear.
2562
2563
        @return The first occurrence of any of the
2564
        characters within `sv` within the string
2565
        starting at the index `pos`, or @ref npos
2566
        if none exists.
2567
2568
        @param sv The characters to search for.
2569
2570
        @param pos The index to start searching at.
2571
        The default argument for this parameter is `0`.
2572
    */
2573
    std::size_t
2574
    find_first_of(
2575
        string_view sv,
2576
        std::size_t pos = 0) const noexcept
2577
    {
2578
        return subview().find_first_of(sv, pos);
2579
    }
2580
2581
    //------------------------------------------------------
2582
2583
    /** Find the first occurrence of any of the characters not within the string.
2584
2585
        Returns the index corrosponding to the first
2586
        character of `{begin() + pos, end())` that is
2587
        not within `sv` if it exists, and @ref npos
2588
        otherwise.
2589
2590
        @par Complexity
2591
2592
        Linear.
2593
2594
        @return The first occurrence of a character that
2595
        is not within `sv` within the string starting at
2596
        the index `pos`, or @ref npos if none exists.
2597
2598
        @param sv The characters to ignore.
2599
2600
        @param pos The index to start searching at.
2601
        The default argument for this parameter is `0`.
2602
    */
2603
    std::size_t
2604
    find_first_not_of(
2605
        string_view sv,
2606
        std::size_t pos = 0) const noexcept
2607
    {
2608
        return subview().find_first_not_of(sv, pos);
2609
    }
2610
2611
    /** Find the first occurrence of a character not equal to `ch`.
2612
2613
        Returns the index corrosponding to the first
2614
        character of `{begin() + pos, end())` that is
2615
        not equal to `ch` if it exists, and
2616
        @ref npos otherwise.
2617
2618
        @par Complexity
2619
2620
        Linear.
2621
2622
        @return The first occurrence of a character that
2623
        is not equal to `ch`, or @ref npos if none exists.
2624
2625
        @param ch The character to ignore.
2626
2627
        @param pos The index to start searching at.
2628
        The default argument for this parameter is `0`.
2629
    */
2630
    std::size_t
2631
    find_first_not_of(
2632
        char ch,
2633
        std::size_t pos = 0) const noexcept
2634
    {
2635
        return subview().find_first_not_of(ch, pos);
2636
    }
2637
2638
    //------------------------------------------------------
2639
2640
    /** Find the last occurrence of any of the characters within the string.
2641
2642
        Returns the index corrosponding to the last
2643
        occurrence of any of the characters of `sv` within
2644
        `{begin(), begin() + pos}` if it exists,
2645
        and @ref npos otherwise.
2646
2647
        @par Complexity
2648
2649
        Linear.
2650
2651
        @return The last occurrence of any of the
2652
        characters within `sv` within the string starting
2653
        before or at the index `pos`, or @ref npos if
2654
        none exists.
2655
2656
        @param sv The characters to search for.
2657
2658
        @param pos The index to stop searching at.
2659
        The default argument for this parameter
2660
        is @ref npos.
2661
    */
2662
    std::size_t
2663
    find_last_of(
2664
        string_view sv,
2665
        std::size_t pos = npos) const noexcept
2666
    {
2667
        return subview().find_last_of(sv, pos);
2668
    }
2669
2670
    //------------------------------------------------------
2671
2672
    /** Find the last occurrence of a character not within the string.
2673
2674
        Returns the index corrosponding to the last
2675
        character of `{begin(), begin() + pos}` that is not
2676
        within `sv` if it exists, and @ref npos otherwise.
2677
2678
        @par Complexity
2679
2680
        Linear.
2681
2682
        @return The last occurrence of a character that is
2683
        not within `sv` within the string before or at the
2684
        index `pos`, or @ref npos if none exists.
2685
2686
        @param sv The characters to ignore.
2687
2688
        @param pos The index to stop searching at.
2689
        The default argument for this parameter
2690
        is @ref npos.
2691
    */
2692
    std::size_t
2693
    find_last_not_of(
2694
        string_view sv,
2695
        std::size_t pos = npos) const noexcept
2696
    {
2697
        return subview().find_last_not_of(sv, pos);
2698
    }
2699
2700
    /** Find the last occurrence of a character not equal to `ch`.
2701
2702
        Returns the index corrosponding to the last
2703
        character of `{begin(), begin() + pos}` that is
2704
        not equal to `ch` if it exists, and @ref npos
2705
        otherwise.
2706
2707
        @par Complexity
2708
2709
        Linear.
2710
2711
        @return The last occurrence of a character that
2712
        is not equal to `ch` before or at the index `pos`,
2713
        or @ref npos if none exists.
2714
2715
        @param ch The character to ignore.
2716
2717
        @param pos The index to start searching at.
2718
        The default argument for this parameter
2719
        is @ref npos.
2720
    */
2721
    std::size_t
2722
    find_last_not_of(
2723
        char ch,
2724
        std::size_t pos = npos) const noexcept
2725
    {
2726
        return subview().find_last_not_of(ch, pos);
2727
    }
2728
2729
    /** Serialize @ref string to an output stream.
2730
2731
        This function serializes a `string` as JSON into the output stream.
2732
2733
        @return Reference to `os`.
2734
2735
        @par Complexity
2736
        Constant or linear in the size of `str`.
2737
2738
        @par Exception Safety
2739
        Strong guarantee.
2740
        Calls to `memory_resource::allocate` may throw.
2741
2742
        @param os The output stream to serialize to.
2743
2744
        @param str The value to serialize.
2745
    */
2746
    BOOST_JSON_DECL
2747
    friend
2748
    std::ostream&
2749
    operator<<(
2750
        std::ostream& os,
2751
        string const& str);
2752
2753
private:
2754
    class undo;
2755
2756
    template<class It>
2757
    using iter_cat = typename
2758
        std::iterator_traits<It>::iterator_category;
2759
2760
    template<class InputIt>
2761
    void
2762
    assign(InputIt first, InputIt last,
2763
        std::random_access_iterator_tag);
2764
2765
    template<class InputIt>
2766
    void
2767
    assign(InputIt first, InputIt last,
2768
        std::input_iterator_tag);
2769
2770
    template<class InputIt>
2771
    void
2772
    append(InputIt first, InputIt last,
2773
        std::random_access_iterator_tag);
2774
2775
    template<class InputIt>
2776
    void
2777
    append(InputIt first, InputIt last,
2778
        std::input_iterator_tag);
2779
2780
    BOOST_JSON_DECL
2781
    void
2782
    reserve_impl(std::size_t new_capacity);
2783
};
2784
2785
//----------------------------------------------------------
2786
2787
namespace detail
2788
{
2789
2790
template <>
2791
inline
2792
string_view
2793
to_string_view<string>(string const& s) noexcept
2794
0
{
2795
0
    return s.subview();
2796
0
}
2797
2798
} // namespace detail
2799
2800
2801
/** Return true if lhs equals rhs.
2802
2803
    A lexicographical comparison is used.
2804
*/
2805
#ifdef BOOST_JSON_DOCS
2806
bool
2807
operator==(string const& lhs, string const& rhs) noexcept
2808
#else
2809
template<class T, class U>
2810
detail::string_comp_op_requirement<T, U>
2811
operator==(T const& lhs, U const& rhs) noexcept
2812
#endif
2813
0
{
2814
0
    return detail::to_string_view(lhs) == detail::to_string_view(rhs);
2815
0
}
2816
2817
/** Return true if lhs does not equal rhs.
2818
2819
    A lexicographical comparison is used.
2820
*/
2821
#ifdef BOOST_JSON_DOCS
2822
bool
2823
operator!=(string const& lhs, string const& rhs) noexcept
2824
#else
2825
template<class T, class U>
2826
detail::string_comp_op_requirement<T, U>
2827
operator!=(T const& lhs, U const& rhs) noexcept
2828
#endif
2829
{
2830
    return detail::to_string_view(lhs) != detail::to_string_view(rhs);
2831
}
2832
2833
/** Return true if lhs is less than rhs.
2834
2835
    A lexicographical comparison is used.
2836
*/
2837
#ifdef BOOST_JSON_DOCS
2838
bool
2839
operator<(string const& lhs, string const& rhs) noexcept
2840
#else
2841
template<class T, class U>
2842
detail::string_comp_op_requirement<T, U>
2843
operator<(T const& lhs, U const& rhs) noexcept
2844
#endif
2845
{
2846
    return detail::to_string_view(lhs) < detail::to_string_view(rhs);
2847
}
2848
2849
/** Return true if lhs is less than or equal to rhs.
2850
2851
    A lexicographical comparison is used.
2852
*/
2853
#ifdef BOOST_JSON_DOCS
2854
bool
2855
operator<=(string const& lhs, string const& rhs) noexcept
2856
#else
2857
template<class T, class U>
2858
detail::string_comp_op_requirement<T, U>
2859
operator<=(T const& lhs, U const& rhs) noexcept
2860
#endif
2861
{
2862
    return detail::to_string_view(lhs) <= detail::to_string_view(rhs);
2863
}
2864
2865
#ifdef BOOST_JSON_DOCS
2866
bool
2867
operator>=(string const& lhs, string const& rhs) noexcept
2868
#else
2869
template<class T, class U>
2870
detail::string_comp_op_requirement<T, U>
2871
operator>=(T const& lhs, U const& rhs) noexcept
2872
#endif
2873
{
2874
    return detail::to_string_view(lhs) >= detail::to_string_view(rhs);
2875
}
2876
2877
/** Return true if lhs is greater than rhs.
2878
2879
    A lexicographical comparison is used.
2880
*/
2881
#ifdef BOOST_JSON_DOCS
2882
bool
2883
operator>(string const& lhs, string const& rhs) noexcept
2884
#else
2885
template<class T, class U>
2886
detail::string_comp_op_requirement<T, U>
2887
operator>(T const& lhs, U const& rhs) noexcept
2888
#endif
2889
{
2890
    return detail::to_string_view(lhs) > detail::to_string_view(rhs);
2891
}
2892
2893
} // namespace json
2894
} // namespace boost
2895
2896
// std::hash specialization
2897
#ifndef BOOST_JSON_DOCS
2898
namespace std {
2899
template<>
2900
struct hash< ::boost::json::string >
2901
{
2902
    BOOST_JSON_DECL
2903
    std::size_t
2904
    operator()( ::boost::json::string const& js ) const noexcept;
2905
};
2906
} // std
2907
#endif
2908
2909
#include <boost/json/impl/string.hpp>
2910
2911
#endif