good-class-generic.cpp
author František Kučera <franta-hg@frantovo.cz>
Wed, 30 Oct 2024 02:51:12 +0100
changeset 1 4502b1c7346d
parent 0 e4f2d6d0e869
permissions -rw-r--r--
licence: GPLv3
     1 /**
     2  * cpp-finally
     3  * Copyright © 2024 František Kučera (Frantovo.cz, GlobalCode.info)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 3 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 
    18 #include <iostream>
    19 #include <exception>
    20 
    21 template<typename T>
    22 class Resource {
    23 private:
    24 	Resource(const Resource&) = delete;
    25 	Resource& operator=(const Resource&) = delete;
    26 public:
    27 	T* data;
    28 	void(*dtor)(T*);
    29 
    30 	Resource(T* data, void(*dtor)(T*)) : data(data), dtor(dtor) {
    31 		std::cout << "  created resource for data at: " << data << std::endl;
    32 	}
    33 
    34 	virtual ~Resource() {
    35 		dtor(data);
    36 		std::cout << "  called destructor on: " << data << std::endl;
    37 	}
    38 };
    39 
    40 void fxThrowing(bool fail, void* data) {
    41 	std::cout << "  doing something with data " << data << std::endl;
    42 	if (fail) throw std::logic_error("error from fxThrowing()");
    43 }
    44 
    45 void fxAllocating(bool fail) {
    46 	Resource buf(malloc(486), free);
    47 	fxThrowing(fail, buf.data);
    48 }
    49 
    50 int main(int argc, char** argv) {
    51 	bool fail = argc == 2 && std::string("fail") == argv[1];
    52 	const char* name = "good-class-generic";
    53 	std::cout << name << " (fail=" << fail << ")\n";
    54 	try {
    55 		fxAllocating(fail);
    56 	} catch (const std::exception& e) {
    57 		std::cout << "  caught exception: " << e.what() << std::endl;
    58 	}
    59 }