To me the question of a no-op region comes down to whether customers would need 
to do logic based on whether a region has a parent. If they do, perhaps a bool 
hasParent() along with getParent() returning a no-op region would be an elegant 
solution. If they do not, then shared_ptr is probably sufficient.

Sarge

> On 10 Oct, 2017, at 12:45, David Kimura <dkim...@pivotal.io> wrote:
> 
> Yes, but I wouldn't expect to ever need to do a type check. Admittedly, I'm
> not sure what one does with parent region, but if we no-op, return sensible
> empty values, or throw when appropriate then maybe we don't care?
> 
> I would expect it to be used something like this:
> 
> auto parent = region.getParent();
> 
> // if region didn't have parent region, this could always return false.
> // else if it did have a parent region it would behave as expected.
> parent.containsKey("a_key");
> 
> 
> If this works, I like that we don't have to special case for calling
> getParent on root region and we could return by value.
> 
> Thanks,
> David
> 
> On Tue, Oct 10, 2017 at 12:29 PM, Jacob Barrett <jbarr...@pivotal.io> wrote:
> 
>> Are you thinking something like?
>> 
>> class NoRegion : public Region {...};
>> 
>> auto parent = region.getParent();
>> if (NoRegion == parent) {
>>  // no parent region
>> }
>> 
>> 
>> On Tue, Oct 10, 2017 at 11:08 AM David Kimura <dkim...@pivotal.io> wrote:
>> 
>>> I'm not sure if this is the same as the sentinel value you mentioned, but
>>> what about introducing a no-op region type and returning that?  I'm
>>> thinking a null object pattern which would no-op and then nobody should
>>> need to check if nullptr.
>>> 
>>> Thanks,
>>> David
>>> 
>>> On Tue, Oct 10, 2017 at 10:27 AM, Jacob Barrett <jbarr...@pivotal.io>
>>> wrote:
>>> 
>>>> Looking at a class like Region (Region.cpp) there are calls to get the
>>>> parent region and sub regions, there are instances where a Region will
>>> not
>>>> have a parent or subs. The current API returns shared_ptr that may be
>>>> nullptr or a Region.
>>>> 
>>>> Since we are trying to make an effort towards values over pointers
>> should
>>>> be considered some changes here? Obviously a reference is out of the
>>>> question because it can't be null. A value is really out of the
>> question
>>>> too since it can't be null and making a sentinel value is not a great
>>>> solution. Raw pointers are fine since they can be nullptr but make
>>>> ownership ambiguous. Using shared_ptr is good since it can be nullptr
>> and
>>>> solves the ownership problem. Another option is to embrace the
>>> forthcoming
>>>> std::optional available as boost::optional in C++11.
>>>> 
>>>> I am leaning towards keeping it shared_ptr since using boost::optional
>>>> would require users compile with boost. I don't think we should have
>>>> anything on our API that is not ours of C++11. Requiring third party
>>>> libraries to compile against our API doesn't fly right by me.
>>>> 
>>>> Thoughts?
>>>> 
>>> 
>> 

Reply via email to