@@ -682,6 +682,11 @@ class JSON_API Value {
682682 iterator begin ();
683683 iterator end ();
684684
685+ // \brief Returns a view of member pairs for range-based for loops.
686+ ValueMembersView members ();
687+ // \brief Returns a view of member pairs for range-based for loops.
688+ ValueConstMembersView members () const ;
689+
685690 // / \brief Returns a reference to the first element in the `Value`.
686691 // / Requires that this value holds an array or json object, with at least one
687692 // / element.
@@ -1040,6 +1045,113 @@ class JSON_API ValueIterator : public ValueIteratorBase {
10401045 pointer operator ->() const { return const_cast <pointer>(&deref ()); }
10411046};
10421047
1048+ /* * \brief Proxy struct to enable range-based for loops over object members.
1049+ */
1050+ struct MemberProxy {
1051+ const String name;
1052+ Value& value;
1053+ };
1054+
1055+ /* * \brief Proxy struct to enable range-based for loops over const object members.
1056+ */
1057+ struct ConstMemberProxy {
1058+ const String name;
1059+ const Value& value;
1060+ };
1061+
1062+ /* * \brief Iterator adapter for range-based for loops.
1063+ */
1064+ class ValueMembersIterator {
1065+ public:
1066+ using iterator_category = std::forward_iterator_tag;
1067+ using value_type = MemberProxy;
1068+ using difference_type = int ;
1069+ using pointer = MemberProxy*;
1070+ using reference = MemberProxy;
1071+
1072+ ValueMembersIterator () = default ;
1073+ explicit ValueMembersIterator (ValueIterator const & iter) : it_(iter) {}
1074+
1075+ ValueMembersIterator& operator ++() {
1076+ ++it_;
1077+ return *this ;
1078+ }
1079+ ValueMembersIterator operator ++(int ) {
1080+ ValueMembersIterator temp (*this );
1081+ ++*this ;
1082+ return temp;
1083+ }
1084+ bool operator ==(ValueMembersIterator const & other) const { return it_ == other.it_ ; }
1085+ bool operator !=(ValueMembersIterator const & other) const { return it_ != other.it_ ; }
1086+ MemberProxy operator *() const { return MemberProxy{it_.name (), *it_}; }
1087+
1088+ private:
1089+ ValueIterator it_;
1090+ };
1091+
1092+ /* * \brief Iterator adapter for range-based for loops.
1093+ */
1094+ class ValueConstMembersIterator {
1095+ public:
1096+ using iterator_category = std::forward_iterator_tag;
1097+ using value_type = ConstMemberProxy;
1098+ using difference_type = int ;
1099+ using pointer = ConstMemberProxy*;
1100+ using reference = ConstMemberProxy;
1101+
1102+ ValueConstMembersIterator () = default ;
1103+ explicit ValueConstMembersIterator (ValueConstIterator const & iter) : it_(iter) {}
1104+
1105+ ValueConstMembersIterator& operator ++() {
1106+ ++it_;
1107+ return *this ;
1108+ }
1109+ ValueConstMembersIterator operator ++(int ) {
1110+ ValueConstMembersIterator temp (*this );
1111+ ++*this ;
1112+ return temp;
1113+ }
1114+ bool operator ==(ValueConstMembersIterator const & other) const { return it_ == other.it_ ; }
1115+ bool operator !=(ValueConstMembersIterator const & other) const { return it_ != other.it_ ; }
1116+ ConstMemberProxy operator *() const { return ConstMemberProxy{it_.name (), *it_}; }
1117+
1118+ private:
1119+ ValueConstIterator it_;
1120+ };
1121+
1122+ /* * \brief Range-based for loop adapter for object members.
1123+ */
1124+ class ValueMembersView {
1125+ public:
1126+ ValueMembersView (ValueIterator begin, ValueIterator end) : begin_(begin), end_(end) {}
1127+ ValueMembersIterator begin () const { return ValueMembersIterator (begin_); }
1128+ ValueMembersIterator end () const { return ValueMembersIterator (end_); }
1129+
1130+ private:
1131+ ValueIterator begin_;
1132+ ValueIterator end_;
1133+ };
1134+
1135+ /* * \brief Range-based for loop adapter for object members.
1136+ */
1137+ class ValueConstMembersView {
1138+ public:
1139+ ValueConstMembersView (ValueConstIterator begin, ValueConstIterator end) : begin_(begin), end_(end) {}
1140+ ValueConstMembersIterator begin () const { return ValueConstMembersIterator (begin_); }
1141+ ValueConstMembersIterator end () const { return ValueConstMembersIterator (end_); }
1142+
1143+ private:
1144+ ValueConstIterator begin_;
1145+ ValueConstIterator end_;
1146+ };
1147+
1148+ inline ValueMembersView Value::members () {
1149+ return ValueMembersView (begin (), end ());
1150+ }
1151+ inline ValueConstMembersView Value::members () const {
1152+ return ValueConstMembersView (begin (), end ());
1153+ }
1154+
10431155inline void swap (Value& a, Value& b) { a.swap (b); }
10441156
10451157inline const Value& Value::front () const { return *begin (); }
0 commit comments