Advertisement
Guest User

Untitled

a guest
Jun 30th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. module Standard {
  2. module Algorithms {
  3. private:
  4. IsRange(srctype) {
  5. // Ranges have a pair of members, Begin and End, which are the same type.
  6. // and support operator* and operator++, at minimum.
  7. begin := srctype.Members.Find("Begin"));
  8. if (!begin) return false;
  9. end := srctype.Members.Find("End"));
  10. if (!end) return false;
  11. if (begin.Type != end.Type) return false;
  12. members := begin.Type.Members;
  13. if (!members.Find("operator*") || !members.Find("operator++")) return false;
  14. return true;
  15. }
  16. public:
  17. Map(src, func) prolog {
  18. if (!IsRange(Utility.Decltype(src))) return false;
  19. if (Utility.Decltype(func(*src.Begin)) != void) return false;
  20. } {
  21. while(val) {
  22. func(*val.Begin);
  23. ++val.Begin;
  24. }
  25. return;
  26. }
  27. Map(src, func) prolog {
  28. if (!IsRange(Utility.Decltype(src))) return false;
  29. } {
  30. result := Standard.Containers.Vector(Expression(func(*val.Begin)).Type)();
  31. while(val) {
  32. result.Insert(result.Back(), func(*val.Begin));
  33. ++val.Begin;
  34. }
  35. return result;
  36. }
  37.  
  38. Map(src, func) {
  39. // Since it's not a range,
  40. // It's a tuple!
  41. Expression(src).Type.Members.Map(function(x)) {
  42. // Tuples have no member functions, they're all member variables
  43. func(x(src));
  44. });
  45. }
  46. }
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement