why won't byPair work with a const AA?
    H. S. Teoh via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Wed Aug  2 11:30:55 PDT 2017
    
    
  
On Wed, Aug 02, 2017 at 11:06:03AM -0700, H. S. Teoh via Digitalmars-d-learn wrote:
[...]
> 	auto byPair(AA)(inout(AA) aa)
> 	{
> 		alias Modifiers = std.traits.getModifiers!AA;
> 		struct Result {
> 			std.traits.ApplyModifiers!(Slot*, Modifiers) slot;
> 			... // range methods here
> 		}
> 		return Result(aa);
> 	}
> 
> Of course, getModifiers and ApplyModifiers are fictitious Phobos
> templates, but you get the idea.
[...]
Hmm, actually, they don't have to be fictitious; here's an actual,
compilable example:
	struct Slot {
		Slot* next;
		string key;
		int value;
	}
	struct AA {
		Slot*[] slots;
	}
	auto byPair(AA)(AA aa)
	{
		import std.traits : QualifierOf;
		alias Qual = QualifierOf!AA;
		struct Result {
			Qual!(Slot)* slot;
			bool empty() { return slot is null; }
			auto front() {
				struct Front {
					Qual!string key;
					Qual!int value;
				}
				return Front(slot.key, slot.value);
			}
			void popFront() {
				slot = slot.next;
			}
		}
		return Result(aa.slots[0]);
	}
	unittest {
		AA aa;
		const(AA) constAa;
		immutable(AA) immAa;
		auto mutPair = aa.byPair;
		static assert(is(typeof(mutPair.front.value) == int));
		auto constPair = constAa.byPair;
		static assert(is(typeof(constPair.front.value) == const(int)));
		auto immPair = immAa.byPair;
		static assert(is(typeof(immPair.front.value) == immutable(int)));
	}
T
-- 
If Java had true garbage collection, most programs would delete themselves upon execution. -- Robert Sewell
    
    
More information about the Digitalmars-d-learn
mailing list