digitalmars.D.learn - dcollections how to LinkList // port c# code
- BLS (28/28) Jun 29 2010 Hi,
- bearophile (4/6) Jun 29 2010 In D use dynamic arrays unless you really need to remove or add a lot of...
- Byron Heads (24/30) Jun 29 2010 D's dynamic arrays are great! Also you should create a constructor for ...
- Steven Schveighoffer (30/56) Jun 29 2010 I think I need to add some constructors that accept data. std.container...
- BLS (72/79) Jun 29 2010 Hi Steve, I think this should work, however I got very strange err. msg....
- Steven Schveighoffer (7/87) Jun 29 2010 One thing to note, ArrayList *does* accept an array as a constructor, an...
- BLS (10/14) Jun 29 2010 Hi Steve
- Byron Heads (12/40) Jun 29 2010 I think you mean to use is here
- bearophile (5/12) Jun 29 2010 I have just filed a bug report on this (it's a lot of time I want to wri...
Hi, private List<Server> _servers; _servers = new List<Server> { new Server{ Name = "ServerI", IP = "120.14.220.18" }, new Server{ Name = "ServerII", IP = "120.14.220.19" }, new Server{ Name = "ServerIII", IP = "120.14.220.20" }, new Server{ Name = "ServerIV", IP = "120.14.220.21" }, new Server{ Name = "ServerV", IP = "120.14.220.22" }, }; D2 so far.. import dcollections.LinkList; class LoadBalancer { alias LinkList!Server ServerList; private ServerList sl; this() { sl = new ServerList; sl.add( new Server() ); ... } Do I really have to create something like this auto x = new Server(); x.Name = "Blah"; x.IP = "120.14.220.22"; s1.add(x) (Name and IP are Server properties.) thanks bjoern
Jun 29 2010
BLS:D2 so far.. import dcollections.LinkList;In D use dynamic arrays unless you really need to remove or add a lot of items from the start or middle of the sequence. On modern CPUs linked lists are usually the wrong data structure to use. Bye, bearophile
Jun 29 2010
On Tue, 29 Jun 2010 15:27:41 -0400, bearophile wrote:In D use dynamic arrays unless you really need to remove or add a lot of items from the start or middle of the sequence. On modern CPUs linked lists are usually the wrong data structure to use. Bye, bearophileD's dynamic arrays are great! Also you should create a constructor for a common build operation. -------------------------------------------- import std.stdio; class Server { string name; string ip; this( string _name, string _ip ) { name = _name; ip = _ip; } string toString() { return name ~ " - " ~ ip; } } void main() { Server[] serverList = [ new Server( "a", "164.76.0.1" ), new Server( "b", "164.76.0.2" ) ]; foreach( server; serverList ) { writeln( server ); } } ----------------------------------------- a - 164.76.0.1 b - 164.76.0.2 -B
Jun 29 2010
On Tue, 29 Jun 2010 15:22:30 -0400, BLS <windevguy hotmail.de> wrote:Hi, private List<Server> _servers; _servers = new List<Server> { new Server{ Name = "ServerI", IP = "120.14.220.18" }, new Server{ Name = "ServerII", IP = "120.14.220.19" }, new Server{ Name = "ServerIII", IP = "120.14.220.20" }, new Server{ Name = "ServerIV", IP = "120.14.220.21" }, new Server{ Name = "ServerV", IP = "120.14.220.22" }, }; D2 so far.. import dcollections.LinkList; class LoadBalancer { alias LinkList!Server ServerList; private ServerList sl; this() { sl = new ServerList; sl.add( new Server() ); ... } Do I really have to create something like this auto x = new Server(); x.Name = "Blah"; x.IP = "120.14.220.22"; s1.add(x) (Name and IP are Server properties.)I think I need to add some constructors that accept data. std.container has some cool construction methods. For now, can you do something like this? sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server(...) ... ]); The new constructor would probably do something like this: sl = new ServerList( new Server(...), new Server(...), ... ); Does that work for you? If you need to build servers by naming fields, I'm not sure that's really a dcollections issue, D doesn't support constructing object by specifing individual field names. Alternatively, you could define an external constructor: Server create(string name, string ip) { auto retval = new Server(); retval.Name = name; retval.IP = ip; return retval; } :) -Steve
Jun 29 2010
On 29/06/2010 22:12, Steven Schveighoffer wrote:For now, can you do something like this? sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server(...) ... ]);Hi Steve, I think this should work, however I got very strange err. msg. in file ArrayList.d Have to stop now..need some sleep. BTW the new constructor stuff would be nice to have. //current code. import std.stdio; import std.random; import dcollections.ArrayList; import dcollections.LinkList; void main() { auto b1 = LoadBalancer(); auto b2 = LoadBalancer(); auto b3 = LoadBalancer(); // Confirm these are the same instance if (b1 == b2 && b2 == b3 ) { writeln("Same instance\n"); } // Next, load 15 requests for a server for (int i = 0; i < 15; i++) { string serverName = b1.nextServer.servername; writeln("Dispatch request to: " ~ serverName); } } // D2 singleton final class LoadBalancer { private static LoadBalancer lb; alias ArrayList!Server ServerList; private ServerList sl; static this() { synchronized lb = new LoadBalancer; } static LoadBalancer opCall() { return lb; } private this() { sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server("ServerII", "121.14.220.18") ]); } property { Server nextServer() { return sl[uniform(0, sl.length)]; } } private class Server { private string _name, _id; this(string name, string id) { this._name = _name; this._id = id; } string servername() { return _name; } /* OLD PROPERTY STUFF property { string servername(string sn) { return _name = sn; } string servername() { return _name; } string id(string id) { return _id = id; } string id() { return _id; } } */ } } cheers,bjoern
Jun 29 2010
On Tue, 29 Jun 2010 17:33:13 -0400, BLS <windevguy hotmail.de> wrote:On 29/06/2010 22:12, Steven Schveighoffer wrote:One thing to note, ArrayList *does* accept an array as a constructor, and it will actually use that array as its storage. This is so you can "wrap" an array as a ArrayList and get the full dcollections functionality from it. The other containers do not accept an array for construction... yet :) -SteveFor now, can you do something like this? sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server(...) ... ]);Hi Steve, I think this should work, however I got very strange err. msg. in file ArrayList.d Have to stop now..need some sleep. BTW the new constructor stuff would be nice to have. //current code. import std.stdio; import std.random; import dcollections.ArrayList; import dcollections.LinkList; void main() { auto b1 = LoadBalancer(); auto b2 = LoadBalancer(); auto b3 = LoadBalancer(); // Confirm these are the same instance if (b1 == b2 && b2 == b3 ) { writeln("Same instance\n"); } // Next, load 15 requests for a server for (int i = 0; i < 15; i++) { string serverName = b1.nextServer.servername; writeln("Dispatch request to: " ~ serverName); } } // D2 singleton final class LoadBalancer { private static LoadBalancer lb; alias ArrayList!Server ServerList; private ServerList sl; static this() { synchronized lb = new LoadBalancer; } static LoadBalancer opCall() { return lb; } private this() { sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server("ServerII", "121.14.220.18") ]); } property { Server nextServer() { return sl[uniform(0, sl.length)]; } } private class Server { private string _name, _id; this(string name, string id) { this._name = _name; this._id = id; } string servername() { return _name; } /* OLD PROPERTY STUFF property { string servername(string sn) { return _name = sn; } string servername() { return _name; } string id(string id) { return _id = id; } string id() { return _id; } } */ } } cheers,bjoern
Jun 29 2010
On 29/06/2010 23:49, Steven Schveighoffer wrote:One thing to note, ArrayList *does* accept an array as a constructor, and it will actually use that array as its storage. This is so you can "wrap" an array as a ArrayList and get the full dcollections functionality from it.Hi Steve This is why I've switched from LinkList to ArrayList. (ArrayList is simply cool) also : Server nextServer() { return sl[uniform(0, sl.length)]; } is impossible with LinkList. ( sl is LinkList) yeah opIndex on linked lists is simply slow. However the snippet in the previous msg. does not compile.. will see later. bjoern
Jun 29 2010
Just a few things that may cause you some bugs/errors On Tue, 29 Jun 2010 23:33:13 +0200, BLS wrote:On 29/06/2010 22:12, Steven Schveighoffer wrote: // Confirm these are the same instance if (b1 == b2 && b2 == b3 ) { writeln("Same instance\n"); }I think you mean to use is here if( b1 is b2 && b2 is b3 ) // == compares value, not pointer/references// D2 singleton final class LoadBalancer { private static LoadBalancer lb; alias ArrayList!Server ServerList; private ServerList sl; static this() { synchronized lb = new LoadBalancer; }Might want the declare the class as synchronized, or make lb sharedprivate this() { sl = new ServerList; sl.add([ new Server("ServerI", "120.14.220.18"), new Server("ServerII", "121.14.220.18") ]); }try sl = new ServerList([ new Server("ServerI", "120.14.220.18"), new Server("ServerII", "121.14.220.18") ]);this(string name, string id) { this._name = _name; this._id = id; }this._name = name; // you had _name -B
Jun 29 2010
Byron Heads:I have just filed a bug report on this (it's a lot of time I want to write it): http://d.puremagic.com/issues/show_bug.cgi?id=4407 Bye, bearophilethis(string name, string id) { this._name = _name; this._id = id; }this._name = name; // you had _name
Jun 29 2010