• Jason Rhinelander's avatar
    Fix stl_bind to support movable, non-copyable value types (#490) · 617fbcfc
    Jason Rhinelander authored
    This commit includes the following changes:
    
    * Don't provide make_copy_constructor for non-copyable container
    
    make_copy_constructor currently fails for various stl containers (e.g.
    std::vector, std::unordered_map, std::deque, etc.) when the container's
    value type (e.g. the "T" or the std::pair<K,T> for a map) is
    non-copyable.  This adds an override that, for types that look like
    containers, also requires that the value_type be copyable.
    
    * stl_bind.h: make bind_{vector,map} work for non-copy-constructible types
    
    Most stl_bind modifiers require copying, so if the type isn't copy
    constructible, we provide a read-only interface instead.
    
    In practice, this means that if the type is non-copyable, it will be,
    for all intents and purposes, read-only from the Python side (but
    currently it simply fails to compile with such a container).
    
    It is still possible for the caller to provide an interface manually
    (by defining methods on the returned class_ object), but this isn't
    something stl_bind can handle because the C++ code to construct values
    is going to be highly dependent on the container value_type.
    
    * stl_bind: copy only for arithmetic value types
    
    For non-primitive types, we may well be copying some complex type, when
    returning by reference is more appropriate.  This commit returns by
    internal reference for all but basic arithmetic types.
    
    * Return by reference whenever possible
    
    Only if we definitely can't--i.e. std::vector<bool>--because v[i]
    returns something that isn't a T& do we copy; for everything else, we
    return by reference.
    
    For the map case, we can always return by reference (at least for the
    default stl map/unordered_map).
    617fbcfc
test_stl_binders.cpp 2.63 KB