Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.

libs/contract/example/features/friend.cpp


// Copyright (C) 2008-2018 Lorenzo Caminiti
// Distributed under the Boost Software License, Version 1.0 (see accompanying
// file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt).
// See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html

#include <boost/contract.hpp>
#include <string>
#include <cassert>

//[friend_byte
class buffer;

class byte {
    friend bool operator==(buffer const& left, byte const& right);
    
private:
    char value_;

    /* ... */
//]

public:
    // Could program invariants and contracts for following too.
    explicit byte(char value) : value_(value) {}
    bool empty() const { return value_ == '\0'; }
};

//[friend_buffer
class buffer {
    // Friend functions are not member functions...
    friend bool operator==(buffer const& left, byte const& right) {
        // ...so check contracts via `function` (which won't check invariants).
        boost::contract::check c = boost::contract::function()
            .precondition([&] {
                BOOST_CONTRACT_ASSERT(!left.empty());
                BOOST_CONTRACT_ASSERT(!right.empty());
            })
        ;
        
        for(char const* x = left.values_.c_str(); *x != '\0'; ++x) {
            if(*x != right.value_) return false;
        }
        return true;
    }

private:
    std::string values_;

    /* ... */
//]

public:
    // Could program invariants and contracts for following too.
    explicit buffer(std::string const& values) : values_(values) {}
    bool empty() const { return values_ == ""; }
};

int main() {
    buffer p("aaa");
    byte a('a');
    assert(p == a);

    buffer q("aba");
    assert(!(q == a)); // No operator!=.
    
    return 0;
}