use pragma once instead of include guard to avoid multiple include