www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 4305] New: Take, Chain on top of ranges w/o moveFront()

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4305

           Summary: Take, Chain on top of ranges w/o moveFront()
           Product: D
           Version: D2
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: dsimcha yahoo.com



import std.range;

struct CountRange {
    uint num;

    uint front() {
        return num;
    }

    void popFront() {
        num++;
    }

    bool empty()  property {
        return num == uint.max;
    }

    typeof(this) save()  property {
        return this;
    }
}

void main() {
    CountRange cr;
    auto t = take(cr, 100); 
}

This produces a compile time error:
d:\dmd2\windows\bin\..\..\src\phobos\std\range.d(1289): Error: template
std.range.moveFront(R) if (is(typeof(&r.front()) == ElementType!(R)*)) does not
match any function template declaration
d:\dmd2\windows\bin\..\..\src\phobos\std\range.d(1289): Error: template
std.range.moveFront(R) if (is(typeof(&r.front()) == ElementType!(R)*)) cannot
deduce template function from argument types !()(CountRange)

Similar results occur when the main block looks like this instead:

void main() {
    CountRange cr1;
    CountRange cr2;
    auto c = chain(cr1, cr2);
}

I guess the correct fix is to just stick moveFront() in a static if block and
disable it for ranges that don't have lvalue elements.  However, I'd like to
get some comments in case I'm misunderstanding the issue here.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 13 2010
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4305


Andrei Alexandrescu <andrei metalanguage.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrei metalanguage.com
         AssignedTo|nobody puremagic.com        |andrei metalanguage.com



20:54:52 PDT ---
The intent is to allow manipulation of ranges that contain types arbitrarily
expensive to copy. The current design requires either front() to yield a ref,
or the range to define moveFront().

I think a better design is to define the module-level std.range.moveFront() to
issue a simple copy when the type being copied does not define this(this). I'll
do so soon. Thanks!

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 13 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4305


Andrei Alexandrescu <andrei metalanguage.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 13 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4305


David Simcha <dsimcha yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED



Fixed in SVN.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 24 2010