Loksim3D Developer Stories – Part 2 – C++ template magic

In Loksim a rail track can have a lot of associated properties. Properties like maximum speed, signals, illumination characteristics, name, stops and so on, which can be seen in the following screenshot:
props

So far the internal implementation of this system heavily depends on constants. For example, if you want to get the maximum speed on a track ‘t’ at position ‘pos’ you would use a function call similar to this:

auto& propSpeed = t.GetProperty(PROPERTY_MAXIMUM_SPEED, pos);

However, ‘p’ does not contain the actual maximum speed: A maximum speed is not a single value, it e.g. contains information if this maximum speed is different for trains with tilt technology or if it is shown in the timetable of the train operator. So a second query – again using a constant – is needed:

float maxSpeed = propSpeed.GetPropertyFloat(PROPERTY_MAXIMUM_SPEED_NORMAL_TRAIN);

This also shows, that one has to know the data type of the actual property when retrieving it. In fact, at the moment all these properties are stored as strings and converted to the requested type when they are queried by the GetPropertyType functions.

This system has two main advantages:

  • It can be extended quite easily: One just has to introduce a new constant PROPERTY_XXX
  • It can be serialized and deserialized to XML in a straightforward way: The values are just written out using the PROPERTY_XXX constants as attribute names

However, working with this system for some years also showed some disadvantages:

  • There does not exist any static check if the property that is queried really makes sense. E.g. in the example above, one could easily write the line propSpeed.GetPropertyString(PROPERTY_STOP_NAME). The compiler can never recognize this error and you would just get an empty property (string) back
  • It can be hard to find the appropriate constant for a property of a rail track. In fact I often end up checking the name in the GUI, searching for it in GUI resource file, than searching for the resource identifier in the code of the editor. There you find the connection between the constant and the GUI name, since there exists some kind of data binding between the GUI and the properties store
  • There exists no IntelliSense that could help to find the existing properties.
  • The data values are converted when they are retrieved and not stored in the original format

One additional characteristic of the system is, that there exist properties which are the same for both directions (e.g. illumination of the rail track) and other ones which are different depending if you are driving forwards or backwards on the track (e.g. stops and names). So far the developer has to know which properties are valid for both directions and which ones depend on the direction on the track. The GetProperty funktion takes an additional argument which determines if the property for the forward or for the backward direction is retrieved.

In the process of rewriting the system for generation of 3D models for the rail tracks I need to access some of these properties. I decided this would be a good occasion to experiment with a new system for such properties. My main design goals were the following:

  • Design system in a way, that the compiler can check for invalid usage of properties and allow the IDE to offer IntelliSense
  • Available properties and the types of the properties should be represented in some way in the source code
  • Static differentation between properties that are the same in both directions and ones where different properties for both directions exist
  • Values should be stored in a typesafe way and not needed to be converted each time properties are accessed
  • Allow fast access and filtering of properties, which means the property lists should store the properties by value and not allocate space on the heap for each single property

First of all I decided to use structures to store the different types of properties. Since every property has at least a position (relative to the track it is associated with), I created a base class for all different kind of properties:

template <bool TBothDirections>
struct RailProperty
{
	static const bool BothDirections = TBothDirections;

	RailProperty() : RailProperty(0.0f * units::meter) { }
	explicit RailProperty(units::distance_m position) :
		position_(position)
	{
	}

	units::distance_m position_;
};

The template parameter TBothDirections is used to differentiate between properties that are valid for both directions and one where different properties for forward and backward exist.

Each type of property is a subclass of the RailProperty struct. In the following two examplary properties are shown:

struct PropLimit : public RailProperty<true>
{
	PropLimit(units::distance_m position, l3d::units::speed_kph limitNormal = units::speed_kph::from_value(100.0f));
	PropLimit(units::distance_m position, l3d::units::speed_kph limitNormal, l3d::units::speed_kph limitNeigetechnik);

	units::speed_kph limitNormal_;
	units::speed_kph limitNeigetechnik_;
};

struct PropUeberhoehung : public RailProperty<false>
{
	PropUeberhoehung(/* ctor parameters */);

	// Properties
};

So how can these properties now be accessed? The user of the interface accesses them through a RailDescription class, which stores information about one rail. Each type of property is stored in an own custom list class. The lists itself are organized in a map[1], where std::type_index is used as a key. The type_index class is new in C++11, can be constructed from std::type_info (which is returned by the typeid operator) and can be used in (hash) maps.
The RailDescription class contains a Properties() function which provides access to a list of properties of the specified type. Since the type of the property is given as a template parameter, the concrete type of the return value is determined at compile time and can be used by IDEs for IntelliSense.

class RailDescription
{
public:
	/* other stuff */

	template <class Prop>
	railprops::PositionedPropertyList<Prop>& Properties()
	{
		auto& l = propLists_[typeid(Prop)];
		if (l.get() == nullptr) {
			l = std::make_unique<railprops::PositionedPropertyList<Prop>>();
		}
		return static_cast<railprops::PositionedPropertyList<Prop>&>(*l);
	}

private:
	std::map<std::type_index, std::unique_ptr<railprops::PositionedPropertyListBase>> propLists_;
	/* other stuff */
};

So what about the PositionedPropertyList class?

template <class Prop>
class PositionedPropertyList : 
	public std::conditional<Prop::BothDirections, PositionedPropertyListWithDir<Prop>, PositionedPropertyListWithoutDir<Prop>>::type
{
};

This class has only one purpose: If the properties that are stored in the list are handled differently for the two directions, PositionedPropertyList is a subclass of PositionedPropertyListWithDir, otherwise of PositionedPropertyListWithoutDir

The PositionedPropertyListWithDir class is responsible to provide two lists itself: One for the forward and one for the backward direction:

template <class Prop>
class PositionedPropertyListWithDir : public PositionedPropertyListBase
{
public:
	PositionedPropertyListWithDir();

	// forward
	PositionedPropertyListWithoutDir<Prop>& Fwd() { return *forwards_; }
	// backwards
	PositionedPropertyListWithoutDir<Prop>& Bwd() { return *backwards_; }
private:
	std::unique_ptr<PositionedPropertyListWithoutDir<Prop>> forwards_;
	std::unique_ptr<PositionedPropertyListWithoutDir<Prop>> backwards_;
};

The class in which the properties are actually stored is the PositionedPropertyListWithoutDir class:

template <class Prop>
class PositionedPropertyListWithoutDir : public PositionedPropertyListBase
{
public:
	// Property with position_ <= position
	// Returns nullptr if there does not exist such property
	const Prop* At(units::distance_m position) const
	{
		auto it = std::upper_bound(cbegin(orderedProps_), cend(orderedProps_), position);
		if (it != cbegin(orderedProps_)) {
			return &(*(it - 1));
		}
		else {
			return nullptr;
		}
	}

	/* Implementation of functions omitted */
	Prop* At(units::distance_m position);
	Prop& Add(const Prop& v);
	Prop& Emplace(units::distance_m position);		
	template<class... Args>
	Prop& Emplace(units::distance_m position, Args&&... args);
	bool DeleteAt(units::distance_m position);
	
private:
	std::vector<Prop> orderedProps_;
};

In this class the properties are stored in a std::vector and a handful of methods to retrieve, add new and delete properties exist. For some use cases probably more advanced methods to retrieve a range of properties are needed, which are not yet implemented.

In the end, the user can access the properties in the following way:

RailDescription rd;

rd.Properties<PropLimit>().Fwd().Add(PropLimit(10.0f * l3d::units::meter, 100.0f * units::kilometer_per_hour));
rd.Properties<PropLimit>().Fwd().Emplace(50.6f * l3d::units::meter, 100.0f * units::kilometer_per_hour);
auto& p1 = rd.Properties<PropLimit>().Fwd().At(4.0f * l3d::units::meter)

rd.Properties<PropUeberhoehung>().Emplace(100.0f * units::meter, UeberhoehungType::FesterWert, 45.0f * units::degrees);
auto& a = rps.Properties<PropUeberhoehung>().At(100.0f * l3d::units::meter)->angle_;

Everything is type checked at compile time and the IDE can provide full IntelliSense. I always knew that C++ templates are a real nice technique to work with. However, I really had a lot of fun creating this system for storing properties. I still think that it offers a nice interface forusers of this part of the code and can be easily used even by people who do not know anything about the way it is implemented. The main reason for this is, that it is statically typed and therefore prevents a lot of careless mistakes.

So far I did not think a lot about serialization of this new property store. I have a few options in mind, but at the moment I do not need it and writing code that is not needed at the moment is… unnecessary 😉

[1] Accoring to a talk by Chandler Carruth both std::map and std::unordered_map are not really optimal data structures. Maybe I will exchange the usage of std::map with a better map sometime, but this is not really relevant for this post.

This entry was posted in Development and tagged , . Bookmark the permalink.

0 Responses to Loksim3D Developer Stories – Part 2 – C++ template magic

  1. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Valuable information.

    least expensive viagra viagra ejaculation pictures
    buy viagra online
    viagra caddis fly pattern – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  2. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Whoa many of beneficial information!

    best deal on viagra mixing antibiotics and viagra
    buy viagra
    viagra bromocriptine combination – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  3. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Useful forum posts. Regards!

    viagra cost viagra se games
    generic viagra
    viagra cheap online – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  4. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually expressed that adequately.

    viagra films viagra erection procedure
    buy viagra
    viagra substitutes – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  5. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.
  6. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Amazing all kinds of very good data.

    viagra withour prescription history viagra
    viagra 100mg
    review viagra vs cialis – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  7. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Amazing all kinds of fantastic advice!

    viagra love feelings what’s better viagra or cialis
    viagra for women
    in mexico viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  8. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You’ve made your point very nicely..

    viagra falls band south bend rush limbaugh viagra
    viagra without a doctor prescription
    does viagra work on first dose – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  9. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You reported it wonderfully.

    penis after taking viagra where to buy viagra us
    generic viagra
    hosta viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  10. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thanks. A good amount of tips!

    viagra precription online 50 mg viagra from canadian pharmacy
    viagra online
    viagra trial pack canada – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  11. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Point effectively utilized..

    viagra canada cheap viagra next day delivery low price
    viagra for sale uk
    where to buy viagra in amsterdam – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  12. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards! Valuable stuff!

    viagra ciesta where to get viagra samples
    generic viagra 100mg
    cfids viagra – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  13. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Loads of posts!

    is generic viagra the same viagra and hypertension
    cheap viagra
    novocaine same day as taking viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  14. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Terrific stuff. Many thanks.

    russian man dies after guzzeling viagra is generic viagra the real thing
    cheap viagra
    rx viagra toledo – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  15. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You mentioned this fantastically!

    viagra tv ad 1999 insurance cover viagra
    viagra pills
    trusted websites for buying viagra online – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  16. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Thank you!

    buy viagra no rx canada least expensive pharmacy for viagra
    generic viagra 100mg
    low-priced buy cheap viagra online garland – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  17. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Superb forum posts, Thanks a lot.

    viagra clipart headquarters viagra company
    cheap viagra
    amy reid is viagra really needed – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  18. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos! Fantastic information.

    charles linskaill search viagra find arutha find sites computer shop viagra free
    viagra without a doctor prescription
    viagra from uk – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  19. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Many thanks. Lots of postings!

    viagra to buy cheap surgery complications from viagra
    viagra pills
    aion ed viagra cialis – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  20. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Whoa quite a lot of wonderful information!

    buying viagra online legal which is better bialis or viagra
    buy generic viagra
    weaknesses of viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  21. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Whoa plenty of great knowledge!

    increasing dosage of viagra viagra cialis review
    buy viagra online
    viagra number of orgasms – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  22. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Fine info. Thanks.

    l-arginine comparable to viagra viagra cialis compared
    buy viagra
    buy viagra new york – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  23. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You made your stand pretty nicely!!

    viagra steroides viagra propecia
    viagra generic
    viagra blog posts – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  24. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Fantastic forum posts, With thanks!

    viagra canadian prescriptions never mix steroids and viagra
    generic viagra
    viagra and heartworm in dogs – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  25. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wow plenty of great material.

    online prescription for viagra mixing antibiotics and viagra
    buy viagra
    dont take viagra with – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  26. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Superb material, Appreciate it!

    viagra order cheap iframe junk email viagra
    viagra online
    viagra boring pages search edinburgh find – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  27. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thanks. I like this.

    generic viagra kamagra caverta pillshoprxcom nonprescription viagra australia
    generic viagra 100mg
    sildenafil citrate generic viagra – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  28. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Very good info. Kudos!

    mix regalis and viagra generic viagra 100mg 100 tabs
    viagra online
    viagra fuerteventura – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  29. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you! I like this!

    viagra marketshare 2009 viagra lexipro difference info
    generic viagra online
    dangers of taking too much viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  30. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually expressed it very well.

    pumkin pie vs viagra generic mexico pharmacy viagra
    buy generic viagra
    viagra ordering on line – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  31. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Fine material. Cheers.

    viagra young phuket buy viagra
    generic viagra online
    detumescence priapism viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  32. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually said that wonderfully!

    viagra and alchol mixed generic viagra capsules
    viagra without a doctors prescription
    does alka seltzer enhance viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  33. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    This is nicely put. .

    big pharma tests viagra viagra test
    viagra online
    personalized gifts cheap viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  34. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you, Plenty of knowledge.

    serotonin viagra sale viagra gif
    generic viagra online
    does viagra make the penis harder – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  35. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Excellent write ups. Appreciate it.

    viagra sale uk viagra libido dick
    viagra online
    viagra hyper – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  36. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Info certainly regarded!!

    holdere a href womens viagra a viagra on an empty stomach
    viagra 100mg
    viagra creme – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  37. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Truly plenty of superb tips.

    viagra freesamples shelf life for viagra
    cheap viagra
    viagra use in females – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  38. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Appreciate it!

    viagra duration action viagra cartooms
    buy generic viagra
    how viagra effects women side effects – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  39. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Truly tons of fantastic advice!

    contraindication epinephrine viagra viagra sex shops
    viagra 100mg
    venereal viagra florida retirement – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  40. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Awesome info. Kudos.

    find viagra free sites online computer best buy for viagra
    viagra without a doctor prescription
    does viagra work for premature ejaculation – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  41. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards. Useful stuff.

    piadas viagra how viagra woirks
    viagra 100mg
    viagra contraindicated high blood pressure – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  42. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wonderful write ups, Thank you!

    cheap online pharmacy viagra viagra sildenafil citrate discount viagra
    viagra without a doctor prescription
    target viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  43. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards, Wonderful stuff.

    viagra procedure canada viagra libido
    cheap viagra
    viagra wisecracks – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  44. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Regards, Plenty of stuff!

    viagra side effects incidence female pink viagra
    generic viagra
    roger clements viagra by post – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  45. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You have made your position very clearly..

    find viagra free edinburgh pages posted non-perscription viagra
    viagra for sale uk
    funny viagra pictures – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  46. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thanks a lot. Excellent information.

    viagra what to expect better viagra cialis
    viagra pills
    50mg viagra uk cheap – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  47. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Appreciate it!

    generic viagra no rx usa folgers coffee viagra
    buy viagra online
    viagra cialis without doctors prescription – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  48. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Nicely put. Appreciate it.

    natural over the counter viagra viagra and cancer
    viagra for sale uk
    cialis genuinerx net viagra viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  49. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You said it adequately.!

    viagra stories escort cyprus chemist viagra
    viagra generic
    alternate uses for viagra – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  50. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Incredible tons of awesome knowledge.

    a href order viagra online a viagra in normal men
    buy viagra
    tiesto viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  51. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You actually expressed that superbly.

    foreign pharmacy viagra cialis vs viagra
    generic viagra 100mg
    viagra official site spam tracking – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  52. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You said this adequately.

    viagra as a diet pill side effect of viagra
    viagra for sale uk
    suppliers viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  53. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Kudos. Awesome stuff.

    is viagra for women cheap no prescription viagra
    viagra generic
    roger clements viagra by post – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  54. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    This is nicely expressed. .

    buy generic viagra img buy viagra zenegra
    buy viagra
    prostrate cancer and viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  55. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Valuable advice. Many thanks!

    who needs viagra safe dose of viagra
    generic viagra 100mg
    viagra how works – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  56. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You’ve made your position quite effectively.!

    make viagra even better use viagra while drunk
    buy viagra online
    viagra on cnn advertisement – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  57. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thanks. Loads of tips!

    palm tree pollen viagra good online place to buy viagra
    viagra for women
    viagra patient info – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  58. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    With thanks. Loads of write ups!

    viagra precautions what happens after to much viagra
    buy viagra
    viagra approved 1998 – https://genericviagrantx.com

    Davidfew
    TerenceMiz
    Victorfut

  59. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.
  60. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wonderful content. Appreciate it.

    results of using viagra irish viagra
    generic viagra 100mg
    pfizer viagra sales 2011 – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  61. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Wonderful content. Thanks a lot!

    cheap viagra order does viagra give you more stamina
    buy viagra online
    viagra spike – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  62. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    You explained this terrifically.

    which works better cialis viagra levitra suppositories viagra
    viagra without a doctors prescription
    demographics viagra use – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  63. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Thank you! I like this!

    viagra cialis levitra what’s best theodore schenk counterfeit viagra
    viagra for women
    viagra funnies – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  64. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    Beneficial facts. Regards.

    viagra ad on rush limbaugh viagra and duration of erection
    viagra 100mg
    does lorazepam inhibitor viagra – https://genericviagrarcp.com

    Davidfew
    TerenceMiz
    Victorfut

  65. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

    With thanks, I like it.

    like viagra purchase viagra in mexico
    viagra generic
    pokemon gold buy viagra – https://genericviagramsl.com

    Davidfew
    TerenceMiz
    Victorfut

  66. AndrewApase says:
    Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.

Leave a Reply

Your email address will not be published. Required fields are marked *