@@ -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,131 @@ 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
1056+ * members.
1057+ */
1058+ struct ConstMemberProxy {
1059+ const String name;
1060+ const Value& value;
1061+ };
1062+
1063+ /* * \brief Iterator adapter for range-based for loops.
1064+ */
1065+ class ValueMembersIterator {
1066+ public:
1067+ using iterator_category = std::forward_iterator_tag;
1068+ using value_type = MemberProxy;
1069+ using difference_type = int ;
1070+ using pointer = MemberProxy*;
1071+ using reference = MemberProxy;
1072+
1073+ ValueMembersIterator () = default ;
1074+ explicit ValueMembersIterator (ValueIterator const & iter) : it_(iter) {}
1075+
1076+ ValueMembersIterator& operator ++() {
1077+ ++it_;
1078+ return *this ;
1079+ }
1080+ ValueMembersIterator operator ++(int ) {
1081+ ValueMembersIterator temp (*this );
1082+ ++*this ;
1083+ return temp;
1084+ }
1085+ bool operator ==(ValueMembersIterator const & other) const {
1086+ return it_ == other.it_ ;
1087+ }
1088+ bool operator !=(ValueMembersIterator const & other) const {
1089+ return it_ != other.it_ ;
1090+ }
1091+ MemberProxy operator *() const { return MemberProxy{it_.name (), *it_}; }
1092+
1093+ private:
1094+ ValueIterator it_;
1095+ };
1096+
1097+ /* * \brief Iterator adapter for range-based for loops.
1098+ */
1099+ class ValueConstMembersIterator {
1100+ public:
1101+ using iterator_category = std::forward_iterator_tag;
1102+ using value_type = ConstMemberProxy;
1103+ using difference_type = int ;
1104+ using pointer = ConstMemberProxy*;
1105+ using reference = ConstMemberProxy;
1106+
1107+ ValueConstMembersIterator () = default ;
1108+ explicit ValueConstMembersIterator (ValueConstIterator const & iter)
1109+ : it_(iter) {}
1110+
1111+ ValueConstMembersIterator& operator ++() {
1112+ ++it_;
1113+ return *this ;
1114+ }
1115+ ValueConstMembersIterator operator ++(int ) {
1116+ ValueConstMembersIterator temp (*this );
1117+ ++*this ;
1118+ return temp;
1119+ }
1120+ bool operator ==(ValueConstMembersIterator const & other) const {
1121+ return it_ == other.it_ ;
1122+ }
1123+ bool operator !=(ValueConstMembersIterator const & other) const {
1124+ return it_ != other.it_ ;
1125+ }
1126+ ConstMemberProxy operator *() const {
1127+ return ConstMemberProxy{it_.name (), *it_};
1128+ }
1129+
1130+ private:
1131+ ValueConstIterator it_;
1132+ };
1133+
1134+ /* * \brief Range-based for loop adapter for object members.
1135+ */
1136+ class ValueMembersView {
1137+ public:
1138+ ValueMembersView (ValueIterator begin, ValueIterator end)
1139+ : begin_(begin), end_(end) {}
1140+ ValueMembersIterator begin () const { return ValueMembersIterator (begin_); }
1141+ ValueMembersIterator end () const { return ValueMembersIterator (end_); }
1142+
1143+ private:
1144+ ValueIterator begin_;
1145+ ValueIterator end_;
1146+ };
1147+
1148+ /* * \brief Range-based for loop adapter for object members.
1149+ */
1150+ class ValueConstMembersView {
1151+ public:
1152+ ValueConstMembersView (ValueConstIterator begin, ValueConstIterator end)
1153+ : begin_(begin), end_(end) {}
1154+ ValueConstMembersIterator begin () const {
1155+ return ValueConstMembersIterator (begin_);
1156+ }
1157+ ValueConstMembersIterator end () const {
1158+ return ValueConstMembersIterator (end_);
1159+ }
1160+
1161+ private:
1162+ ValueConstIterator begin_;
1163+ ValueConstIterator end_;
1164+ };
1165+
1166+ inline ValueMembersView Value::members () {
1167+ return ValueMembersView (begin (), end ());
1168+ }
1169+ inline ValueConstMembersView Value::members () const {
1170+ return ValueConstMembersView (begin (), end ());
1171+ }
1172+
10431173inline void swap (Value& a, Value& b) { a.swap (b); }
10441174
10451175inline const Value& Value::front () const { return *begin (); }
0 commit comments