Is there a general philosophy in D phobos on when to pass by value or reference? For instance, to find a slice using lowerBound many copies of the target item, as well as copies of items in the collection are made (see code example below). This seems unnecessary - why not have
functions like:

    auto lowerBound(...)(V value)

be:

    auto lowerBound(...)(ref V value)

or:

    auto lowerBound(...)(auto ref V value)

Is this a source for desire for no postblits, shallow semantics on
copy/assignment with additional logic for copy on write semantics. If libraries in general are coded to make many copies of parameters it might be a big improvement to not have postblits. A general purpose
library accessing ranges will not know the semantics of V (deep or
shallow), so why incur the cost of copies? Certainly finding a
lowerBound on a range of V can be done with 0 copies of elements?

Is there an established philosophy?

Thanks
Dan
-------
  struct S {
    DateTime date;
    double val;
this(this) { writeln("copying S ", &this, ' ', date, ',', val); }
  }
---------------
  auto before(ref const(ValueType) vt) const {
    auto ass = assumeSorted!orderingPred(_history[]);
    writeln("Before lb");
    auto lb = ass.lowerBound(vt);
    writeln("After lb");
    return History!(V, orderingPred)(_history[0 .. lb.length]);
  }

---------------
Before lb
copying S 7FFF622CE110 2001-Nov-01 00:00:00,0
copying S 7FFF622CE090 2001-Nov-01 00:00:00,0
copying S 7FFF622CE020 2001-Jan-01 00:00:00,100
copying S 7FFF622CE030 2001-Nov-01 00:00:00,0
copying S 7FFF622CDF90 2001-Jan-01 00:00:00,100
copying S 7FFF622CDFA0 2001-Nov-01 00:00:00,0
copying S 7FFF622CE020 2002-Jan-01 00:00:00,200
copying S 7FFF622CE030 2001-Nov-01 00:00:00,0
copying S 7FFF622CDF90 2002-Jan-01 00:00:00,200
copying S 7FFF622CDFA0 2001-Nov-01 00:00:00,0
copying S 7FFF622CE020 2001-Jan-01 00:00:00,200
copying S 7FFF622CE030 2001-Nov-01 00:00:00,0
copying S 7FFF622CDF90 2001-Jan-01 00:00:00,200
copying S 7FFF622CDFA0 2001-Nov-01 00:00:00,0
After lb

Reply via email to