libdatasketches_sys 0.1.3

Low-level bindings for Apache DataSketches C++ library
Documentation
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <catch2/catch.hpp>

#include <iostream>

#include "optional.hpp"

namespace datasketches {

class tt {
public:
  tt() = delete; // make sure it cannot be default constructed
  tt(int val): val_(val) {}
  tt(const tt& other): val_(other.val_) { std::cout << "tt copy constructor\n"; }
  tt(tt&& other): val_(other.val_) { std::cout << "tt move constructor\n"; }
  tt& operator=(const tt& other) { val_ = other.val_; std::cout << "tt copy assignment\n"; return *this; }
  tt& operator=(tt&& other) { val_ = other.val_; std::cout << "tt move assignment\n"; return *this; }
  int get_val() const { return val_; }
private:
  int val_;
};

TEST_CASE("optional", "[common]") {
  optional<tt> opt;
  REQUIRE_FALSE(opt);
  opt.emplace(5);
  REQUIRE(bool(opt));
  REQUIRE((*opt).get_val() == 5);
  REQUIRE(opt->get_val() == 5);
  opt.reset();
  REQUIRE_FALSE(opt);

  optional<tt> opt2(opt);
  REQUIRE_FALSE(opt2);

  opt2.emplace(3);
  if (opt2) *opt2 = 6; // good if it is initialized
  REQUIRE(opt2->get_val() == 6);

  opt.reset();
  REQUIRE_FALSE(opt);
  optional<tt> opt3(std::move(opt));
  REQUIRE_FALSE(opt3);
  *opt3 = 7; // don't do this! may be dangerous for arbitrary T, and it still thinks it is not initialized
  REQUIRE_FALSE(opt3);
  opt3.emplace(8);
  REQUIRE(bool(opt3));
  REQUIRE(opt3->get_val() == 8);

  std::swap(opt2, opt3);
  REQUIRE(opt2->get_val() == 8);
  REQUIRE(opt3->get_val() == 6);

  std::swap(opt2, opt);
  REQUIRE_FALSE(opt2);
  REQUIRE(bool(opt));
  REQUIRE(opt->get_val() == 8);
}

TEST_CASE("optional conversion", "[common]") {
  optional<float> opt_f(1);
  optional<double> opt_d(opt_f);
  REQUIRE(bool(opt_d));
  REQUIRE(*opt_d == static_cast<double>(*opt_f));
}

} /* namespace datasketches */